using System; using System.Collections.Generic; using System.Threading.Tasks; public sealed class BriskLeaderboardModule : BriskModuleBase { public async Task> GetTopAsync(string rankKey, int limit = 20) { ValidateRankKey(rankKey); return await ExecuteAsync(async context => { var data = await context.HttpClient.GetRawDataAsync( $"/ranks/{rankKey}/top", CreateLimitQuery(limit), true); return (IReadOnlyList)BriskModelMapper.ToLeaderboardEntries(data); }); } public async Task GetMeAsync(string rankKey) { ValidateRankKey(rankKey); return await ExecuteAsync(async context => { var data = await context.HttpClient.GetRawDataAsync($"/ranks/{rankKey}/me", null, true); return BriskModelMapper.ToLeaderboardPlayerRank(BriskModelMapper.ExtractObject(data)); }); } public async Task> GetAroundMeAsync(string rankKey, int range = 10) { ValidateRankKey(rankKey); return await ExecuteAsync(async context => { var data = await context.HttpClient.GetRawDataAsync( $"/ranks/{rankKey}/around-me", CreateRangeQuery(range), true); return (IReadOnlyList)BriskModelMapper.ToLeaderboardEntries(data); }); } public async Task SubmitScoreAsync(string rankKey, long score) { ValidateRankKey(rankKey); await ExecuteAsync(async context => { await context.HttpClient.PostJsonRawAsync( $"/ranks/{rankKey}/score", new Dictionary { { "score", score } }, true); }); } public async Task GetCurrentSeasonAsync(string rankKey) { ValidateRankKey(rankKey); return await ExecuteAsync(async context => { var data = await context.HttpClient.GetRawDataAsync($"/ranks/{rankKey}/season/current", null, true); return BriskModelMapper.ToRankSeasonInfo(BriskModelMapper.ExtractObject(data)); }); } public async Task> GetSeasonHistoryAsync(string rankKey, int limit = 20) { ValidateRankKey(rankKey); return await ExecuteAsync(async context => { var data = await context.HttpClient.GetRawDataAsync( $"/ranks/{rankKey}/history", CreateLimitQuery(limit), true); return (IReadOnlyList)BriskModelMapper.ToRankSeasonInfos(data); }); } public async Task> GetSeasonHistoryDetailAsync(string rankKey, string seasonId, int limit = 20) { ValidateRankKey(rankKey); RequireNotEmpty(seasonId, nameof(seasonId)); return await ExecuteAsync(async context => { var data = await context.HttpClient.GetRawDataAsync( $"/ranks/{rankKey}/history/{seasonId}", CreateLimitQuery(limit), true); return (IReadOnlyList)BriskModelMapper.ToLeaderboardEntries(data); }); } private static Dictionary CreateLimitQuery(int limit) { return limit > 0 ? new Dictionary { { "limit", limit.ToString() } } : null; } private static Dictionary CreateRangeQuery(int range) { return range > 0 ? new Dictionary { { "range", range.ToString() } } : null; } private static void ValidateRankKey(string rankKey) { RequireNotEmpty(rankKey, nameof(rankKey)); } }