rank.go 8.3 KB

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