/// <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));
        }