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  }