using System; using System.Threading; using System.Threading.Tasks; using RudderSdk.Core.Models.BattlePass; namespace RudderSdk.Core; /// /// 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) — supplies them /// during scenario runs. /// public sealed class BattlePassService { /// Free reward track, see . public const string TrackFree = "free"; /// Premium reward track, see . public const string TrackPremium = "premium"; private readonly RudderClient _client; internal BattlePassService(RudderClient client) => _client = client; /// Reads current progress: xp, level, premium ownership, claimed tiers. public Task GetProgressAsync(string scenarioSlug, string nodeId, CancellationToken cancellationToken = default) => _client.SendAsync( "POST", "/sdk/v1/battlepass/progress", new GetBattlePassProgressRequest { ScenarioSlug = scenarioSlug, NodeId = nodeId }, cancellationToken); /// Credits xp and returns the new xp/level and level-up flags. public Task AddXpAsync(AddBattlePassXpRequest request, CancellationToken cancellationToken = default) => _client.SendAsync( "POST", "/sdk/v1/battlepass/xp", request, cancellationToken); /// /// Claims a tier reward at a reached level (idempotent server-side). /// is or . /// public Task ClaimRewardAsync(ClaimBattlePassRewardRequest request, CancellationToken cancellationToken = default) => _client.SendAsync( "POST", "/sdk/v1/battlepass/claim", request, cancellationToken); /// /// Purchases the premium track (charges the wallet). When /// is null, a random one is generated. /// public Task PurchasePremiumAsync(PurchaseBattlePassPremiumRequest request, CancellationToken cancellationToken = default) { request.IdempotencyKey ??= Guid.NewGuid().ToString(); return _client.SendAsync( "POST", "/sdk/v1/battlepass/premium", request, cancellationToken); } }