github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/game/internal/rank.go (about) 1 package internal 2 3 import ( 4 "common" 5 "conf" 6 "msg" 7 "time" 8 9 "github.com/name5566/leaf/log" 10 "gopkg.in/mgo.v2/bson" 11 ) 12 13 var ( 14 monthChipsRank []msg.MonthChipsRank // 金币排行榜 15 monthWinsRank []msg.MonthWinsRank // 胜场排行榜 16 ) 17 18 var ( 19 showRankLen = conf.GetCfgRank().ShowRankLen // 排行榜展示最大长度,带有头像和昵称的 20 ) 21 22 func init() { 23 common.HourClock(time.Duration(conf.GetCfgRank().UpdateRankTime)*time.Hour, generateMCR, generateMWR) 24 } 25 26 type TempUserInfo struct { 27 Nickname string 28 Headimgurl string 29 } 30 31 // 生成MonthChipsRank 32 func generateMCR() { 33 var result struct { 34 UserID int 35 MonthChips int64 36 } 37 monthChipsRank = []msg.MonthChipsRank{} 38 tempInfo := TempUserInfo{} 39 db := mongoDB.Ref() 40 defer mongoDB.UnRef(db) 41 iter := db.DB(DB).C("monthrank").Find(bson.M{"monthchips": bson.M{"$gt": 0}}).Sort("-monthchips").Limit(showRankLen).Iter() 42 for iter.Next(&result) { 43 err := db.DB(DB).C("users").FindId(result.UserID).One(&tempInfo) 44 if err != nil { 45 log.Error("month rank monthchips find user info error : %v", err) 46 continue 47 } 48 monthChipsRank = append(monthChipsRank, msg.MonthChipsRank{ 49 UserID: result.UserID, 50 Nickname: tempInfo.Nickname, 51 Headimgurl: tempInfo.Headimgurl, 52 Chips: result.MonthChips, 53 }) 54 } 55 if err := iter.Close(); err != nil { 56 log.Error("generateMCR iter.Next error: %v", err) 57 } 58 } 59 60 // 生成MonthWinsRank 61 func generateMWR() { 62 var result struct { 63 UserID int 64 MonthWins int 65 } 66 monthWinsRank = []msg.MonthWinsRank{} 67 tempInfo := TempUserInfo{} 68 db := mongoDB.Ref() 69 defer mongoDB.UnRef(db) 70 iter := db.DB(DB).C("monthrank").Find(bson.M{"monthwins": bson.M{"$gt": 0}}).Sort("-monthwins").Limit(showRankLen).Iter() 71 for iter.Next(&result) { 72 err := db.DB(DB).C("users").FindId(result.UserID).One(&tempInfo) 73 if err != nil { 74 log.Error("month rank monthwins find user info error : %v", err) 75 continue 76 } 77 monthWinsRank = append(monthWinsRank, msg.MonthWinsRank{ 78 UserID: result.UserID, 79 Nickname: tempInfo.Nickname, 80 Headimgurl: tempInfo.Headimgurl, 81 Wins: result.MonthWins, 82 }) 83 } 84 if err := iter.Close(); err != nil { 85 log.Error("generateMWR iter.Next error: %v", err) 86 } 87 } 88 89 func (user *User) getMonthChipsRank(pageNum int) { 90 if pageNum < 1 { 91 return 92 } 93 onePageLen := 20 // 单页长度 94 pageSum := 0 // 总页数 95 if len(monthChipsRank) < showRankLen { 96 pageSum = len(monthChipsRank) / onePageLen 97 if len(monthChipsRank)%onePageLen > 0 { 98 pageSum++ 99 } 100 } else { 101 pageSum = showRankLen / onePageLen 102 } 103 if pageNum > pageSum && pageSum != 0 { 104 return 105 } 106 tempRanks := []msg.TempMCR{} 107 if pageSum != 0 { 108 start := onePageLen * (pageNum - 1) 109 end := 0 110 if start+onePageLen < len(monthChipsRank) { 111 end = start + onePageLen 112 } else { 113 end = len(monthChipsRank) 114 } 115 for index := start; index < end; index++ { 116 tempRanks = append(tempRanks, msg.TempMCR{ 117 Nickname: monthChipsRank[index].Nickname, 118 Headimgurl: monthChipsRank[index].Headimgurl, 119 Chips: monthChipsRank[index].Chips, 120 }) 121 } 122 } 123 user.WriteMsg(&msg.S2C_UpdateMonthChipsRanks{ 124 PageNum: pageNum, 125 PageSum: pageSum, 126 ChipsRanks: tempRanks, 127 }) 128 } 129 130 func (user *User) getMonthChipsRankPos() { 131 for i := 0; i < len(monthChipsRank); i++ { 132 if user.baseData.userData.UserID == monthChipsRank[i].UserID { 133 user.WriteMsg(&msg.S2C_UpdateMonthChipsRankPos{ 134 Pos: i + 1, 135 Chips: monthChipsRank[i].Chips, 136 }) 137 return 138 } 139 } 140 user.WriteMsg(&msg.S2C_UpdateMonthChipsRankPos{ 141 Pos: 0, 142 Chips: 0, 143 }) 144 } 145 146 func (user *User) getMonthWinsRank(pageNum int) { 147 if pageNum < 1 { 148 return 149 } 150 onePageLen := 20 // 单页长度 151 pageSum := 0 // 总页数 152 if len(monthWinsRank) < showRankLen { 153 pageSum = len(monthWinsRank) / onePageLen 154 if len(monthWinsRank)%onePageLen > 0 { 155 pageSum++ 156 } 157 } else { 158 pageSum = showRankLen / onePageLen 159 } 160 if pageNum > pageSum && pageSum != 0 { 161 return 162 } 163 tempRanks := []msg.TempMWR{} 164 if pageSum != 0 { 165 start := onePageLen * (pageNum - 1) 166 end := 0 167 if start+onePageLen < len(monthWinsRank) { 168 end = start + onePageLen 169 } else { 170 end = len(monthWinsRank) 171 } 172 for index := start; index < end; index++ { 173 tempRanks = append(tempRanks, msg.TempMWR{ 174 Nickname: monthWinsRank[index].Nickname, 175 Headimgurl: monthWinsRank[index].Headimgurl, 176 Wins: monthWinsRank[index].Wins, 177 }) 178 } 179 } 180 user.WriteMsg(&msg.S2C_UpdateMonthWinsRanks{ 181 PageNum: pageNum, 182 PageSum: pageSum, 183 WinsRanks: tempRanks, 184 }) 185 } 186 187 func (user *User) getMonthWinsRankPos() { 188 for i := 0; i < len(monthWinsRank); i++ { 189 if user.baseData.userData.UserID == monthWinsRank[i].UserID { 190 user.WriteMsg(&msg.S2C_UpdateMonthWinsRankPos{ 191 Pos: i + 1, 192 Wins: monthWinsRank[i].Wins, 193 }) 194 return 195 } 196 } 197 user.WriteMsg(&msg.S2C_UpdateMonthWinsRankPos{ 198 Pos: 0, 199 Wins: 0, 200 }) 201 } 202 203 func upsertMonthChipsRank(userID int, addChips int64) { 204 db := mongoDB.Ref() 205 defer mongoDB.UnRef(db) 206 _, err := db.DB(DB).C("monthrank").Upsert(bson.M{"userid": userID}, bson.M{"$inc": bson.M{"monthchips": addChips}}) 207 if err != nil { 208 log.Error("monthrank chips add error: %v", err) 209 } 210 } 211 212 func upsertMonthWinsRank(userID, addWins int) { 213 db := mongoDB.Ref() 214 defer mongoDB.UnRef(db) 215 _, err := db.DB(DB).C("monthrank").Upsert(bson.M{"userid": userID}, bson.M{"$inc": bson.M{"monthwins": addWins}}) 216 if err != nil { 217 log.Error("monthrank wins add error: %v", err) 218 } 219 } 220 221 func (user *User) dropMonthRank() { 222 log.Debug("<-- DROP MONTH RANK START -->") 223 skeleton.Go(func() { 224 db := mongoDB.Ref() 225 defer mongoDB.UnRef(db) 226 now := time.Now().Unix() 227 // month chips rank 228 mcr := struct { 229 UserID int 230 MonthChips int64 231 CleanTime int64 232 }{} 233 if len(monthChipsRank) > 0 { 234 max := 10 235 if len(monthChipsRank) < max { 236 max = len(monthChipsRank) 237 } 238 for i := 0; i < max; i++ { 239 mcr.UserID = monthChipsRank[i].UserID 240 mcr.MonthChips = monthChipsRank[i].Chips 241 mcr.CleanTime = now 242 err := db.DB(DB).C("monthrankchipsrecord").Insert(mcr) 243 if err != nil { 244 log.Error("insert month chips rank top 10 error: %v", err) 245 } 246 } 247 } 248 log.Debug("<-- STORE MONTH CHIPS RANK TOP 10 OVER -->") 249 err := db.DB(DB).C("monthrank").DropCollection() 250 if err != nil { 251 log.Error("monthrank drop error: %v", err) 252 } 253 log.Debug("<-- DROP MONTH RANK OVER -->") 254 user.WriteMsg(&msg.S2C_CleanMonthRanks{}) 255 }, nil) 256 }