2026-06-04 17:16:17 +08:00
|
|
|
using System;
|
|
|
|
|
using Dirichlet.Mediation;
|
|
|
|
|
using Runtime.ADAggregator;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
public sealed class TapadnAwardVideoPlayer : ADPlayer, IDirichletRewardVideoAutoAdListener
|
|
|
|
|
{
|
2026-06-04 17:24:54 +08:00
|
|
|
private const float RewardCloseSettleDelaySeconds = 0.25f;
|
|
|
|
|
|
2026-06-04 17:16:17 +08:00
|
|
|
private DirichletAdNative _adNative;
|
|
|
|
|
private DirichletRewardVideoAd _loadedAd;
|
|
|
|
|
private bool _rewardVerified;
|
2026-06-04 17:24:54 +08:00
|
|
|
private bool _rewardVerifyReceived;
|
|
|
|
|
private bool _closePendingRewardVerify;
|
|
|
|
|
private bool _showSettled;
|
|
|
|
|
private AdTimeHandler _rewardCloseSettleHandler;
|
2026-06-04 17:16:17 +08:00
|
|
|
|
|
|
|
|
public override int MaxLoadAttempts => TapadnAdController.CurrentOptions?.RewardedMaxLoadAttempts ?? base.MaxLoadAttempts;
|
|
|
|
|
public override float LoadRetryDelaySeconds => Math.Max(0f, (TapadnAdController.CurrentOptions?.RewardedLoadRetryDelayMs ?? 500) / 1000f);
|
|
|
|
|
public override float ShowPendingTimeoutSeconds => Math.Max(1f, (TapadnAdController.CurrentOptions?.RewardedShowTimeoutMs ?? 20000) / 1000f);
|
|
|
|
|
public override bool AutoPreloadOnInit => TapadnAdController.CurrentOptions?.RewardedPrewarmOnInit ?? false;
|
|
|
|
|
|
|
|
|
|
public override void OnInit()
|
|
|
|
|
{
|
|
|
|
|
_adNative = DirichletAdManager.CreateAdNative();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool IsReadly()
|
|
|
|
|
{
|
|
|
|
|
if (UseAutoLoad())
|
|
|
|
|
{
|
|
|
|
|
return TapadnAdRequestFactory.TryParseSlotId(Key, out _);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (_loadedAd != null && _loadedAd.IsLoaded && _loadedAd.IsValid)
|
|
|
|
|
{
|
|
|
|
|
curState = 2;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void LoadAD()
|
|
|
|
|
{
|
|
|
|
|
if (!TapadnAdRequestFactory.TryParseSlotId(Key, out _))
|
|
|
|
|
{
|
|
|
|
|
Debug.LogError($"[TapADN] Invalid rewarded slot id: {Key}");
|
|
|
|
|
curState = 0;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (UseAutoLoad())
|
|
|
|
|
{
|
|
|
|
|
curState = 2;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
_adNative.PreLoad(TapadnAdRequestFactory.BuildRewarded(Key, TapadnAdController.CurrentOptions), 3);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception exception)
|
|
|
|
|
{
|
|
|
|
|
Debug.LogWarning($"[TapADN] Rewarded preload skipped: {exception.Message}");
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (curState == 1 || IsReadly())
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
curState = 1;
|
2026-06-05 21:44:35 +08:00
|
|
|
TapadnSmartLoadOrchestrator.OnLoadStarted(AD_Type.AwardVideo, AdScene);
|
2026-06-04 17:16:17 +08:00
|
|
|
_adNative.LoadRewardVideoAd(
|
|
|
|
|
TapadnAdRequestFactory.BuildRewarded(Key, TapadnAdController.CurrentOptions),
|
|
|
|
|
ad =>
|
|
|
|
|
{
|
2026-06-05 21:44:35 +08:00
|
|
|
TapadnSmartLoadOrchestrator.OnLoadResult(AD_Type.AwardVideo, AdScene, true);
|
2026-06-04 17:16:17 +08:00
|
|
|
_loadedAd?.Destroy();
|
|
|
|
|
_loadedAd = ad;
|
|
|
|
|
_loadedAd.Shown += OnManualShown;
|
|
|
|
|
_loadedAd.Clicked += OnManualClicked;
|
2026-06-04 17:24:54 +08:00
|
|
|
_loadedAd.ShowFailed += OnManualShowFailed;
|
2026-06-04 17:16:17 +08:00
|
|
|
_loadedAd.RewardVerified += OnManualRewardVerify;
|
|
|
|
|
_loadedAd.Closed += OnManualClosed;
|
|
|
|
|
curState = 2;
|
|
|
|
|
Debug.Log($"[TapADN] Rewarded loaded. slot={Key}");
|
|
|
|
|
},
|
|
|
|
|
error =>
|
|
|
|
|
{
|
2026-06-05 21:44:35 +08:00
|
|
|
TapadnSmartLoadOrchestrator.OnLoadResult(AD_Type.AwardVideo, AdScene, false);
|
2026-06-04 17:16:17 +08:00
|
|
|
curState = 0;
|
|
|
|
|
Debug.LogError($"[TapADN] Rewarded load failed. code={error.Code}, message={error.Message}");
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void ShowAD(Action onClose, Action<bool> onVideoComplete)
|
|
|
|
|
{
|
|
|
|
|
adListener.onClose = onClose;
|
|
|
|
|
adListener.onVideoComplete = onVideoComplete;
|
|
|
|
|
_rewardVerified = false;
|
2026-06-04 17:24:54 +08:00
|
|
|
_rewardVerifyReceived = false;
|
|
|
|
|
_closePendingRewardVerify = false;
|
|
|
|
|
_showSettled = false;
|
|
|
|
|
_rewardCloseSettleHandler?.Kill();
|
|
|
|
|
_rewardCloseSettleHandler = null;
|
2026-06-04 17:16:17 +08:00
|
|
|
curState = 0;
|
|
|
|
|
|
|
|
|
|
if (UseAutoLoad())
|
|
|
|
|
{
|
|
|
|
|
_adNative.ShowRewardVideoAutoAd(TapadnAdRequestFactory.BuildRewarded(Key, TapadnAdController.CurrentOptions), this);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (_loadedAd == null || !_loadedAd.Show())
|
|
|
|
|
{
|
2026-06-04 17:24:54 +08:00
|
|
|
OnError(new DirichletError("show_failed", "ShowRewardVideoAd returned false"));
|
2026-06-04 17:16:17 +08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void OnError(DirichletError error)
|
|
|
|
|
{
|
2026-06-04 17:24:54 +08:00
|
|
|
if (_showSettled)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_showSettled = true;
|
|
|
|
|
_rewardCloseSettleHandler?.Kill();
|
|
|
|
|
_rewardCloseSettleHandler = null;
|
2026-06-04 17:16:17 +08:00
|
|
|
curState = 0;
|
2026-06-05 21:44:35 +08:00
|
|
|
TapadnSmartLoadOrchestrator.OnShowError(AD_Type.AwardVideo, AdScene);
|
2026-06-04 17:16:17 +08:00
|
|
|
Debug.LogError($"[TapADN] Rewarded show failed. code={error?.Code}, message={error?.Message}");
|
|
|
|
|
adListener.OnShowError();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void OnAdShow()
|
|
|
|
|
{
|
2026-06-05 21:44:35 +08:00
|
|
|
TapadnSmartLoadOrchestrator.OnShowStart(AD_Type.AwardVideo, AdScene);
|
2026-06-04 17:16:17 +08:00
|
|
|
NotifyShowStarted();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void OnAdClose()
|
|
|
|
|
{
|
2026-06-04 17:24:54 +08:00
|
|
|
if (_showSettled)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (_rewardVerifyReceived)
|
|
|
|
|
{
|
|
|
|
|
CompleteRewardedClose();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_closePendingRewardVerify = true;
|
|
|
|
|
_rewardCloseSettleHandler?.Kill();
|
|
|
|
|
_rewardCloseSettleHandler = ADManager.Instance.CreateTimer(RewardCloseSettleDelaySeconds, CompleteRewardedClose);
|
2026-06-04 17:16:17 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void OnRewardVerify(DirichletRewardVerificationEventArgs args)
|
|
|
|
|
{
|
2026-06-04 17:24:54 +08:00
|
|
|
_rewardVerifyReceived = true;
|
2026-06-04 17:16:17 +08:00
|
|
|
_rewardVerified = args != null && args.IsVerified;
|
2026-06-04 17:24:54 +08:00
|
|
|
if (_closePendingRewardVerify)
|
|
|
|
|
{
|
|
|
|
|
CompleteRewardedClose();
|
|
|
|
|
}
|
2026-06-04 17:16:17 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void OnAdClick()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-05 21:44:35 +08:00
|
|
|
public override void OnPlayRequestStarted()
|
|
|
|
|
{
|
|
|
|
|
TapadnSmartLoadOrchestrator.OnPlayRequestStarted(AD_Type.AwardVideo, AdScene, !UseAutoLoad() && IsReadly());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void EnterAdScenario(string scenario)
|
|
|
|
|
{
|
|
|
|
|
TapadnSmartLoadOrchestrator.OnEnterAdScenario(AD_Type.AwardVideo, scenario, Key);
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-04 17:16:17 +08:00
|
|
|
private bool UseAutoLoad()
|
|
|
|
|
{
|
|
|
|
|
return TapadnAdController.CurrentOptions?.RewardedAutoLoad ?? true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnManualShown()
|
|
|
|
|
{
|
2026-06-05 21:44:35 +08:00
|
|
|
OnAdShow();
|
2026-06-04 17:16:17 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnManualClicked()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-04 17:24:54 +08:00
|
|
|
private void OnManualShowFailed(DirichletError error)
|
|
|
|
|
{
|
|
|
|
|
OnError(error);
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-04 17:16:17 +08:00
|
|
|
private void OnManualRewardVerify(DirichletRewardVerificationEventArgs args)
|
|
|
|
|
{
|
2026-06-04 17:24:54 +08:00
|
|
|
OnRewardVerify(args);
|
2026-06-04 17:16:17 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnManualClosed()
|
|
|
|
|
{
|
|
|
|
|
_loadedAd?.Destroy();
|
|
|
|
|
_loadedAd = null;
|
|
|
|
|
OnAdClose();
|
|
|
|
|
}
|
2026-06-04 17:24:54 +08:00
|
|
|
|
|
|
|
|
private void CompleteRewardedClose()
|
|
|
|
|
{
|
|
|
|
|
if (_showSettled)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_showSettled = true;
|
|
|
|
|
_closePendingRewardVerify = false;
|
|
|
|
|
_rewardCloseSettleHandler?.Kill();
|
|
|
|
|
_rewardCloseSettleHandler = null;
|
|
|
|
|
adListener.OnRewardVerify(_rewardVerified, TapadnAdController.CurrentOptions?.RewardAmount ?? 1, TapadnAdController.CurrentOptions?.RewardName ?? string.Empty);
|
|
|
|
|
adListener.OnAdClose();
|
|
|
|
|
}
|
2026-06-04 17:16:17 +08:00
|
|
|
}
|