rank.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. package timelimitactivityrank
  2. // import (
  3. // "encoding/json"
  4. // "fmt"
  5. // "leafstalk/covenant/model"
  6. // "leafstalk/covenant/msg"
  7. // "leafstalk/covenant/servers"
  8. // "leafstalk/log"
  9. // "leafstalk/otherutils/redisdo"
  10. // "net/url"
  11. // "store/db"
  12. // "store/mailbox"
  13. // "strconv"
  14. // "time"
  15. // "github.com/gomodule/redigo/redis"
  16. // )
  17. // const (
  18. // defaultTimeScore = 1000_0000
  19. // )
  20. // type TimeLimitRank struct {
  21. // Name string // 活动名称
  22. // TimeScoreMask int64 // = 1000_0000
  23. // MailType int
  24. // FindRankAward func(int) ([]*model.DropMaterial, []int64)
  25. // GetActivityTime func() (startTime int64, endTime int64)
  26. // RankItemList []*msg.NormalRankItem
  27. // FastQueryRank map[int64]*msg.NormalRankItem
  28. // }
  29. // func (t *TimeLimitRank) RankKey(startTime int64) string {
  30. // period := time.Unix(startTime, 0).Format("20060102")
  31. // return fmt.Sprintf("%vrank:%v", t.Name, period)
  32. // }
  33. // func (t *TimeLimitRank) RankRewardKey() string {
  34. // return fmt.Sprintf("%vrank_award", t.Name) //"lady38rank_award"
  35. // }
  36. // // 结算上一期活动排行
  37. // // startTime:上期活动的开始时间
  38. // // count: 上期活动排行奖励人数
  39. // func (t *TimeLimitRank) SettleRankReward(startTime int64, count int) {
  40. // //获取成员数,建立发奖项目,定时发送一定数量,发送完毕后,删除
  41. // key := t.RankKey(startTime)
  42. // cnt, err := redis.Int(redisdo.Do("ZCARD", key))
  43. // if err != nil {
  44. // log.WithField("from", t.Name).Errorln("SettleRankPrize ZCARD error: ", key, err)
  45. // return
  46. // }
  47. // awardKey := t.RankRewardKey()
  48. // _, err = redisdo.Do("HMSET", awardKey, "total", cnt, "start", 0, "stop", 0, "key", key)
  49. // if err != nil {
  50. // log.WithField("from", t.Name).Errorln("SettleRankPrize HMSET error: ", key, err)
  51. // return
  52. // }
  53. // }
  54. // // 获取周期排行信息
  55. // func (t *TimeLimitRank) getRankList(key string, start int, stop int) (list []*model.NormalRankItem) {
  56. // datas, err := redis.Int64s(redisdo.Do("ZREVRANGE", key, start, stop, "WITHSCORES"))
  57. // if err != nil {
  58. // log.WithField("from", t.Name).Errorf("getRankList key %s fail, err: %s", key, err.Error())
  59. // return
  60. // }
  61. // //其他人排名
  62. // l1 := len(datas)
  63. // index := 0
  64. // for i := 0; i < l1; i += 2 {
  65. // playerId := datas[i]
  66. // score := datas[i+1] / t.TimeScoreMask
  67. // index += 1
  68. // rk := new(model.NormalRankItem)
  69. // rk.PlayerID = playerId
  70. // rk.Level = int(score)
  71. // rk.Rank = index + start
  72. // list = append(list, rk)
  73. // }
  74. // return list
  75. // }
  76. // // 定时发送一部分排行奖励邮件
  77. // func (t *TimeLimitRank) SendRankPrizeByTimer() {
  78. // //获取当前已发送信息
  79. // awardKey := t.RankRewardKey()
  80. // datas, err := redis.StringMap(redisdo.Do("HGETALL", awardKey))
  81. // if err != nil {
  82. // log.WithField("from", t.Name).Errorln("SendRankPrizeByTimer HGETALL error: ", err)
  83. // return
  84. // }
  85. // if len(datas) == 0 {
  86. // return
  87. // }
  88. // total, _ := strconv.Atoi(datas["total"])
  89. // start, _ := strconv.Atoi(datas["start"])
  90. // stop, _ := strconv.Atoi(datas["stop"])
  91. // rankKey := datas["key"]
  92. // expTime := time.Now().Add(time.Hour * 24 * 7)
  93. // if stop < total {
  94. // // 设置新的发奖范围
  95. // start = stop
  96. // if start > 0 {
  97. // start += 1
  98. // }
  99. // stop = start + 300 //100
  100. // if stop > total {
  101. // stop = total
  102. // }
  103. // _, err = redisdo.Do("HMSET", awardKey, "start", start, "stop", stop)
  104. // if err != nil {
  105. // log.WithField("from", t.Name).Errorf("SendRankPrizeByTimer %v HMSET error. week: %v, start - end: %v %v, error: %v", awardKey, start, stop, err)
  106. // return
  107. // }
  108. // //获奖
  109. // // 获取周排行信息
  110. // list := t.getRankList(rankKey, start, stop)
  111. // if list == nil {
  112. // log.WithField("from", t.Name).Errorf("SendRankPrizeByTimer getRankList error. key: %v, start - end: %v %v, error: %v", rankKey, start, stop, err)
  113. // return
  114. // }
  115. // // 批量插入
  116. // var letterLst []*model.Letter
  117. // for _, item := range list {
  118. // ms, es := t.FindRankAward(item.Rank)
  119. // if ms != nil || es != nil {
  120. // letter := new(model.Letter)
  121. // letter.PlayerId = item.PlayerID
  122. // letter.Type = t.MailType
  123. // letter.Extra.Materials = ms
  124. // letter.Extra.Equips = es
  125. // letter.ExpireTime = expTime
  126. // extra := model.LetterExtraInfo{
  127. // Level: item.Level,
  128. // Rank: item.Rank,
  129. // }
  130. // jex, err := json.Marshal(&extra)
  131. // if err != nil {
  132. // log.WithField("from", t.Name).Errorf("SendRankPrizeByTimer LetterExtraRank marshal error. %v, error: %v", extra, err)
  133. // continue
  134. // }
  135. // letter.ExtraInfo = string(jex)
  136. // letterLst = append(letterLst, letter)
  137. // } else { // 如果奖品为空,说明后续无奖励了,直接跳出
  138. // break
  139. // }
  140. // }
  141. // if len(letterLst) == 0 {
  142. // return
  143. // }
  144. // // 插入奖品
  145. // _, err := db.GetEngine().Insert(&letterLst)
  146. // if err != nil {
  147. // log.WithField("from", t.Name).Errorf("SendRankPrizeByTimer Insert error. key: %v, start - end: %v %v, error: %v", rankKey, start, stop, err)
  148. // return
  149. // }
  150. // mailbox.AddNewLetters(letterLst)
  151. // //广播
  152. // mm := new(msg.MsgMulticast)
  153. // mm.Type = 1
  154. // for _, v := range letterLst {
  155. // mm.PlayerIds = append(mm.PlayerIds, v.PlayerId)
  156. // }
  157. // servers.SendToPlayersByGates(-12, mm)
  158. // }
  159. // //删除发奖项目
  160. // if stop >= total {
  161. // _, err = redis.Int(redisdo.Do("DEL", awardKey))
  162. // if err != nil {
  163. // log.WithField("from", t.Name).Errorln("SendRankPrizeByTimer DEL error: ", err)
  164. // return
  165. // }
  166. // }
  167. // }
  168. // func isActivityOpened(ct int64, st int64, et int64) bool {
  169. // if st == 0 && et == 0 {
  170. // return true
  171. // }
  172. // if ct >= st && ct <= et {
  173. // return true
  174. // }
  175. // return false
  176. // }
  177. // // refreshRankingList 刷新内存中的rankingList
  178. // func (t *TimeLimitRank) refreshRankingList() ([]*msg.NormalRankItem, map[int64]*msg.NormalRankItem) {
  179. // // 现在需要刷新排行吗?
  180. // ct := time.Now().Unix()
  181. // st, et := t.GetActivityTime()
  182. // if !isActivityOpened(ct, st, et) {
  183. // return nil, nil
  184. // }
  185. // key := t.RankKey(st)
  186. // datas, err := redis.Int64s(redisdo.Do("ZREVRANGE", key, 0, 500, "WITHSCORES"))
  187. // if err != nil {
  188. // log.WithField("from", t.Name).Errorf("refreshRankingList get %s fail, err: %s", key, err.Error())
  189. // return nil, nil
  190. // }
  191. // //其他人排名
  192. // var list []*msg.NormalRankItem
  193. // fast := make(map[int64]*msg.NormalRankItem)
  194. // l1 := len(datas)
  195. // index := 0
  196. // for i := 0; i < l1; i += 2 {
  197. // playerId := datas[i]
  198. // score := datas[i+1] / t.TimeScoreMask
  199. // index += 1
  200. // rk := new(msg.NormalRankItem)
  201. // rk.PlayerID = playerId
  202. // rk.Score = score
  203. // rk.Rank = index
  204. // list = append(list, rk)
  205. // fast[rk.PlayerID] = rk
  206. // }
  207. // //加载昵称
  208. // var ids []int64
  209. // for _, v := range list {
  210. // ids = append(ids, v.PlayerID)
  211. // // if v2, ok := t.FastQueryRank[v.PlayerID]; ok {
  212. // // v.NickName = v2.NickName
  213. // // v.CombatEffe = v2.CombatEffe
  214. // // // v.HeadImg = v2.HeadImg
  215. // // } else {
  216. // // ids = append(ids, v.PlayerID)
  217. // // }
  218. // }
  219. // if len(ids) > 0 {
  220. // players := db.LoadNameCombat(ids)
  221. // for _, v := range players {
  222. // if v2, ok := fast[v.PlayerId]; ok {
  223. // v2.NickName = url.QueryEscape(v.NickName)
  224. // v2.CombatEffe = v.CombatEffe
  225. // v2.HeadImg = v.ImgUrl
  226. // v2.FrameId = v.HeadImg.FrameId
  227. // v2.HeadId = v.HeadImg.HeadId
  228. // }
  229. // }
  230. // }
  231. // return list, fast
  232. // }
  233. // func (t *TimeLimitRank) getTimeScore(startTime int64, endTime int64) int64 {
  234. // max := endTime - startTime
  235. // if max >= t.TimeScoreMask {
  236. // max = t.TimeScoreMask - 1
  237. // }
  238. // ct := time.Now().Unix()
  239. // score := endTime - ct
  240. // if score > max {
  241. // return max
  242. // } else if score < 0 {
  243. // return 0
  244. // }
  245. // return int64(score)
  246. // }
  247. // // 更新排行 score:总积分
  248. // func (t *TimeLimitRank) updatePlayerRank(playerId int64, score int64) {
  249. // var args []interface{}
  250. // //key
  251. // st, et := t.GetActivityTime()
  252. // key := t.RankKey(st)
  253. // args = append(args, key)
  254. // // score
  255. // timeScore := t.getTimeScore(st, et)
  256. // nscore := score*t.TimeScoreMask + timeScore
  257. // args = append(args, nscore, playerId)
  258. // //保存
  259. // _, err := redisdo.Do("zadd", args...)
  260. // if err != nil {
  261. // log.WithField("from", t.Name).Warnf("updateRedisScore error %v", err)
  262. // }
  263. // }