using System; using System.Threading; using System.Threading.Tasks; using Newtonsoft.Json.Linq; using RudderSdk.Core.Models.BattlePass; namespace RudderSdk.Core; /// /// A scenario battle-pass node. Battle-pass operations are bound to this /// node's scenario/node/run ids; , /// and a successful post callbacks. /// public sealed class BattlePassEffect { private readonly EffectHandle _handle; private readonly BattlePassService _battlePass; internal BattlePassEffect(EffectHandle handle, BattlePassService battlePass) { _handle = handle; _battlePass = battlePass; } /// Run id. public string RunId => _handle.RunId; /// Scenario id. public string ScenarioId => _handle.ScenarioId; /// Node id. public string NodeId => _handle.NodeId; /// Node data payload. public JObject Data => _handle.Data; /// Reads a typed value from the node data. public T Get(string key, T defaultValue = default!) => _handle.Get(key, defaultValue); /// Reads current progress (xp, level, premium ownership, claimed tiers) for this node. public Task GetProgressAsync(CancellationToken cancellationToken = default) => _battlePass.GetProgressAsync(_handle.ScenarioId, _handle.NodeId, cancellationToken); /// Credits xp from a configured source. public Task AddXpAsync(string source, long amount, CancellationToken cancellationToken = default) => _battlePass.AddXpAsync(new AddBattlePassXpRequest { ScenarioId = _handle.ScenarioId, NodeId = _handle.NodeId, RunId = _handle.RunId, Source = source, Amount = amount }, cancellationToken); /// /// Claims a tier reward at a reached level. /// is or . /// public Task ClaimRewardAsync(int level, string track, CancellationToken cancellationToken = default) => _battlePass.ClaimRewardAsync(new ClaimBattlePassRewardRequest { ScenarioId = _handle.ScenarioId, NodeId = _handle.NodeId, RunId = _handle.RunId, Level = level, Track = track }, cancellationToken); /// Purchases the premium track, then posts onPremiumPurchase on success. public async Task PurchasePremiumAsync(CancellationToken cancellationToken = default) { var response = await _battlePass.PurchasePremiumAsync(new PurchaseBattlePassPremiumRequest { ScenarioId = _handle.ScenarioId, NodeId = _handle.NodeId, RunId = _handle.RunId, IdempotencyKey = Guid.NewGuid().ToString() }, cancellationToken).ConfigureAwait(false); if (response != null && response.Success == true) await _handle.CompleteAsync("onPremiumPurchase", cancellationToken).ConfigureAwait(false); return response!; } /// Posts the onLevelUp callback. public Task LevelUpAsync(CancellationToken cancellationToken = default) => _handle.CompleteAsync("onLevelUp", cancellationToken); /// Posts the onLevelUp callback (fire-and-forget). public void LevelUp() => _handle.Complete("onLevelUp"); /// Posts the onComplete callback. public Task EndAsync(CancellationToken cancellationToken = default) => _handle.CompleteAsync("onComplete", cancellationToken); /// Posts the onComplete callback (fire-and-forget). public void End() => _handle.Complete("onComplete"); }