func userRecStatHandler(request *http.Request, resp http.ResponseWriter, redis *models.RedisLogger, form userRecStatForm) { user := &models.Account{} stats := &statResp{} if find, err := user.FindByUserid(form.Userid); !find { e := errors.NewError(errors.NotExistsError, "user not found") if err != nil { e = errors.NewError(errors.DbError, err.Error()) } writeResponse(request.RequestURI, resp, nil, e) return } stats.RecCount, _ = models.TotalRecords(form.Userid) stats.TotalDistance, stats.TotalDuration = redis.RecStats(form.Userid) maxDisRec, _ := models.MaxDistanceRecord(form.Userid) maxSpeedRec, _ := models.MaxSpeedRecord(form.Userid) stats.MaxDistance = &record{} if maxDisRec.Sport != nil { stats.MaxDistance.Type = maxDisRec.Type stats.MaxDistance.Source = maxDisRec.Sport.Source stats.MaxDistance.BeginTime = maxDisRec.StartTime.Unix() stats.MaxDistance.EndTime = maxDisRec.EndTime.Unix() stats.MaxDistance.Duration = maxDisRec.Sport.Duration stats.MaxDistance.Distance = maxDisRec.Sport.Distance } stats.MaxSpeed = &record{} if maxSpeedRec.Sport != nil { stats.MaxDistance.Type = maxDisRec.Type stats.MaxDistance.Source = maxDisRec.Sport.Source stats.MaxDistance.BeginTime = maxDisRec.StartTime.Unix() stats.MaxDistance.EndTime = maxDisRec.EndTime.Unix() stats.MaxSpeed.Duration = maxSpeedRec.Sport.Duration stats.MaxSpeed.Distance = maxSpeedRec.Sport.Distance } stats.Score = user.Props.Score stats.Actor = userActor(user.Actor) stats.Level = user.Level() //stats.Rank = userRank(stats.Level) stats.Index = redis.LBDisRank(form.Userid) + 1 stats.LBCount = redis.LBDisCard() writeResponse(request.RequestURI, resp, stats, nil) }
func leaderboardHandler(request *http.Request, resp http.ResponseWriter, redis *models.RedisLogger, user *models.Account, form leaderboardForm) { if form.Paging.Count == 0 { form.Paging.Count = models.DefaultPageSize } start := 0 stop := 0 switch form.Type { case "FRIEND": ids := redis.Friends("friend", user.Id) friends, err := models.Users(ids, &form.Paging) if err != nil { writeResponse(request.RequestURI, resp, nil, err) return } lb := make([]leaderboardResp, len(friends)) for i, _ := range friends { lb[i].Userid = friends[i].Id lb[i].Score = friends[i].Props.Score lb[i].Level = friends[i].Level() lb[i].Profile = friends[i].Profile lb[i].Nickname = friends[i].Nickname lb[i].Gender = friends[i].Gender lb[i].Actor = friends[i].Actor lb[i].LastLog = friends[i].LastLogin.Unix() lb[i].Birth = friends[i].Birth lb[i].Location = friends[i].Loc lb[i].Phone = friends[i].Phone } respData := map[string]interface{}{ "members_list": lb, "page_frist_id": form.Paging.First, "page_last_id": form.Paging.Last, } writeResponse(request.RequestURI, resp, respData, nil) return case "USER_AROUND": rank := redis.LBDisRank(form.Info) if rank < 0 { writeResponse(request.RequestURI, resp, nil, errors.NewError(errors.NotExistsError, "user not exist")) return } if form.Paging.Count < 0 { start = rank stop = rank break } start = rank - form.Paging.Count if start < 0 { start = 0 } stop = rank + form.Paging.Count case "TOP": fallthrough default: start, stop = leaderboardPaging(&form.Paging) } kv := redis.GetDisLB(start, stop) ids := make([]string, len(kv)) for i, _ := range kv { ids[i] = kv[i].K } users, _ := models.FindUsersByIds(0, ids...) lb := make([]leaderboardResp, len(kv)) for i, _ := range kv { lb[i].Userid = kv[i].K lb[i].Rank = start + i + 1 lb[i].Score = kv[i].V for _, user := range users { if user.Id == kv[i].K { lb[i].Nickname = user.Nickname lb[i].Profile = user.Profile break } } } page_first := 0 page_last := 0 if len(lb) > 0 { page_first = lb[0].Rank page_last = lb[len(lb)-1].Rank } respData := map[string]interface{}{ "members_list": lb, "page_frist_id": strconv.Itoa(page_first), "page_last_id": strconv.Itoa(page_last), } writeResponse(request.RequestURI, resp, respData, nil) }