Files
CC-Framework.BriskGameServer/PackageSource/com.foldcc.cc-framework.brisk-game-server/Runtime/Leaderboard/BriskLeaderboardModule.cs

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