/// <summary> /// RetrieveScoresAsync /// </summary> /// <param name="retrievalDetails"></param> /// <returns></returns> // [START FETCHSCORES_SERVER] public async Task <IList <LeaderboardItemModel> > RetrieveScoresAsync(RetrieveScoresDetails retrievalDetails) { IDatabase db = _redis.GetDatabase(); List <LeaderboardItemModel> leaderboard = new List <LeaderboardItemModel>(); long offset = retrievalDetails.Offset; long numScores = retrievalDetails.NumScores; // If centered, get rank of specified user first if (!string.IsNullOrWhiteSpace(retrievalDetails.CenterKey)) { // SortedSetRankAsync corresponds to ZREVRANK var rank = await db.SortedSetRankAsync(LEADERBOARD_KEY, retrievalDetails.CenterKey, Order.Descending); // If specified user is not present, return empty leaderboard if (!rank.HasValue) { return(leaderboard); } // Use rank to calculate offset offset = Math.Max(0, rank.Value + retrievalDetails.Offset); // Account for number of scores when we're attempting to center // at element in rank [0, abs(offset)) if (offset <= 0) { numScores = rank.Value + Math.Abs((long)retrievalDetails.Offset) + 1; } } // SortedSetRangeByScoreWithScoresAsync corresponds to ZREVRANGEBYSCORE [WITHSCORES] var scores = await db.SortedSetRangeByScoreWithScoresAsync(LEADERBOARD_KEY, skip : offset, take : numScores, order : Order.Descending); var startingRank = offset; for (int i = 0; i < scores.Length; i++) { var lbItem = new LeaderboardItemModel { Rank = startingRank++, PlayerName = scores[i].Element.ToString(), Score = scores[i].Score }; leaderboard.Add(lbItem); } return(leaderboard); }
public async Task <JsonResult> RetrieveScores(string centerKey, int offset, int numScores) { var retrievalDetails = new RetrieveScoresDetails { CenterKey = centerKey, Offset = offset, NumScores = numScores }; var leaderboard = await _leaderboardRepo.RetrieveScoresAsync(retrievalDetails); return(Json(leaderboard)); }