0.3.0: UGC removed, battlepass context-carrying API, scenario behavior aligned with web SDK, CI publish
CI / check (push) Successful in 50s
CI / publish (push) Failing after 37s

This commit is contained in:
edmand46
2026-08-19 17:48:58 +03:00
parent 9d8fb29a7c
commit 2a8d5d4f2f
22 changed files with 234 additions and 388 deletions
+24 -35
View File
@@ -6,16 +6,17 @@ using RudderSdk.Core.Models.BattlePass;
namespace RudderSdk.Core;
/// <summary>
/// Battle pass progress and rewards. The simple overloads target the project's
/// default battle pass; the request-based overloads carry the scenario node
/// context and are used by the scenario runtime.
/// Battle pass progress and rewards. Battle pass state is tied to a scenario
/// battle pass node, so every call carries the scenario/node ids (and a run id
/// for the mutating calls) — <see cref="BattlePassSession"/> supplies them
/// during scenario runs.
/// </summary>
public sealed class BattlePassService
{
/// <summary>Free reward track, see <see cref="ClaimRewardAsync(int, string, CancellationToken)"/>.</summary>
/// <summary>Free reward track, see <see cref="ClaimRewardAsync(ClaimBattlePassRewardRequest, CancellationToken)"/>.</summary>
public const string TrackFree = "free";
/// <summary>Premium reward track, see <see cref="ClaimRewardAsync(int, string, CancellationToken)"/>.</summary>
/// <summary>Premium reward track, see <see cref="ClaimRewardAsync(ClaimBattlePassRewardRequest, CancellationToken)"/>.</summary>
public const string TrackPremium = "premium";
private readonly RudderClient _client;
@@ -23,55 +24,43 @@ public sealed class BattlePassService
internal BattlePassService(RudderClient client) => _client = client;
/// <summary>Reads current progress: xp, level, premium ownership, claimed tiers.</summary>
public Task<GetBattlePassProgressResponse> GetProgressAsync(CancellationToken cancellationToken = default)
=> GetProgressAsync(new GetBattlePassProgressRequest(), cancellationToken);
/// <summary>Credits xp and returns the new xp/level and level-up flags.</summary>
public Task<AddBattlePassXpResponse> AddXpAsync(long amount, CancellationToken cancellationToken = default)
=> AddXpAsync(new AddBattlePassXpRequest { Amount = amount }, cancellationToken);
/// <summary>
/// Claims a tier reward at a reached level (idempotent server-side).
/// <paramref name="track"/> is <see cref="TrackFree"/> or <see cref="TrackPremium"/>.
/// </summary>
public Task<ClaimBattlePassRewardResponse> ClaimRewardAsync(int level, string track, CancellationToken cancellationToken = default)
=> ClaimRewardAsync(new ClaimBattlePassRewardRequest { Level = level, Track = track }, cancellationToken);
/// <summary>
/// Purchases the premium track (charges the wallet). When
/// <paramref name="idempotencyKey"/> is null, a random one is generated.
/// </summary>
public Task<PurchaseBattlePassPremiumResponse> PurchasePremiumAsync(string? idempotencyKey = null, CancellationToken cancellationToken = default)
=> PurchasePremiumAsync(new PurchaseBattlePassPremiumRequest
{
IdempotencyKey = idempotencyKey ?? Guid.NewGuid().ToString()
}, cancellationToken);
internal Task<GetBattlePassProgressResponse> GetProgressAsync(GetBattlePassProgressRequest request, CancellationToken cancellationToken = default)
public Task<GetBattlePassProgressResponse> GetProgressAsync(string scenarioId, string nodeId, CancellationToken cancellationToken = default)
=> _client.SendAsync<GetBattlePassProgressRequest, GetBattlePassProgressResponse>(
"POST",
"/sdk/v1/battlepass/progress",
request,
new GetBattlePassProgressRequest { ScenarioId = scenarioId, NodeId = nodeId },
cancellationToken);
internal Task<AddBattlePassXpResponse> AddXpAsync(AddBattlePassXpRequest request, CancellationToken cancellationToken = default)
/// <summary>Credits xp and returns the new xp/level and level-up flags.</summary>
public Task<AddBattlePassXpResponse> AddXpAsync(AddBattlePassXpRequest request, CancellationToken cancellationToken = default)
=> _client.SendAsync<AddBattlePassXpRequest, AddBattlePassXpResponse>(
"POST",
"/sdk/v1/battlepass/xp",
request,
cancellationToken);
internal Task<ClaimBattlePassRewardResponse> ClaimRewardAsync(ClaimBattlePassRewardRequest request, CancellationToken cancellationToken = default)
/// <summary>
/// Claims a tier reward at a reached level (idempotent server-side).
/// <see cref="ClaimBattlePassRewardRequest.Track"/> is <see cref="TrackFree"/> or <see cref="TrackPremium"/>.
/// </summary>
public Task<ClaimBattlePassRewardResponse> ClaimRewardAsync(ClaimBattlePassRewardRequest request, CancellationToken cancellationToken = default)
=> _client.SendAsync<ClaimBattlePassRewardRequest, ClaimBattlePassRewardResponse>(
"POST",
"/sdk/v1/battlepass/claim",
request,
cancellationToken);
internal Task<PurchaseBattlePassPremiumResponse> PurchasePremiumAsync(PurchaseBattlePassPremiumRequest request, CancellationToken cancellationToken = default)
=> _client.SendAsync<PurchaseBattlePassPremiumRequest, PurchaseBattlePassPremiumResponse>(
/// <summary>
/// Purchases the premium track (charges the wallet). When
/// <see cref="PurchaseBattlePassPremiumRequest.IdempotencyKey"/> is null, a random one is generated.
/// </summary>
public Task<PurchaseBattlePassPremiumResponse> PurchasePremiumAsync(PurchaseBattlePassPremiumRequest request, CancellationToken cancellationToken = default)
{
request.IdempotencyKey ??= Guid.NewGuid().ToString();
return _client.SendAsync<PurchaseBattlePassPremiumRequest, PurchaseBattlePassPremiumResponse>(
"POST",
"/sdk/v1/battlepass/premium",
request,
cancellationToken);
}
}