You've already forked CC-Framework.BriskGameServer
143 lines
4.5 KiB
C#
143 lines
4.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Threading.Tasks;
|
|
|
|
/// <summary>
|
|
/// 排行榜模块。
|
|
/// </summary>
|
|
public sealed class BriskLeaderboardModule
|
|
: BriskModuleBase
|
|
{
|
|
/// <summary>
|
|
/// 获取排行榜 Top 列表。
|
|
/// </summary>
|
|
public async Task<IReadOnlyList<BriskLeaderboardEntry>> 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<BriskLeaderboardEntry>)BriskModelMapper.ToLeaderboardEntries(data);
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取当前玩家在排行榜中的信息。
|
|
/// </summary>
|
|
public async Task<BriskLeaderboardPlayerRank> 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));
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取当前玩家附近的排名区间。
|
|
/// </summary>
|
|
public async Task<IReadOnlyList<BriskLeaderboardEntry>> 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<BriskLeaderboardEntry>)BriskModelMapper.ToLeaderboardEntries(data);
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 提交当前玩家分数。
|
|
/// </summary>
|
|
public async Task SubmitScoreAsync(string rankKey, long score)
|
|
{
|
|
ValidateRankKey(rankKey);
|
|
|
|
await ExecuteAsync(async context =>
|
|
{
|
|
await context.HttpClient.PostJsonRawAsync(
|
|
$"/ranks/{rankKey}/score",
|
|
new Dictionary<string, object> { { "score", score } },
|
|
true);
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取当前赛季信息。
|
|
/// </summary>
|
|
public async Task<BriskRankSeasonInfo> 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));
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取赛季历史列表。
|
|
/// </summary>
|
|
public async Task<IReadOnlyList<BriskRankSeasonInfo>> 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<BriskRankSeasonInfo>)BriskModelMapper.ToRankSeasonInfos(data);
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取指定历史赛季的排行榜详情。
|
|
/// </summary>
|
|
public async Task<IReadOnlyList<BriskLeaderboardEntry>> 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<BriskLeaderboardEntry>)BriskModelMapper.ToLeaderboardEntries(data);
|
|
});
|
|
}
|
|
|
|
private static Dictionary<string, string> CreateLimitQuery(int limit)
|
|
{
|
|
return limit > 0
|
|
? new Dictionary<string, string> { { "limit", limit.ToString() } }
|
|
: null;
|
|
}
|
|
|
|
private static Dictionary<string, string> CreateRangeQuery(int range)
|
|
{
|
|
return range > 0
|
|
? new Dictionary<string, string> { { "range", range.ToString() } }
|
|
: null;
|
|
}
|
|
|
|
private static void ValidateRankKey(string rankKey)
|
|
{
|
|
RequireNotEmpty(rankKey, nameof(rankKey));
|
|
}
|
|
}
|