Files
ft/Client/Assets/Scripts/Services/RewardAdHandler.cs
2026-06-29 21:18:33 +08:00

148 lines
5.7 KiB
C#

using asap.core;
using GameCore;
using System;
using System.Threading.Tasks;
namespace game
{
public class RewardAdHandler
{
private readonly string adUnitId;
private bool isLoadTriggered;
private int retryCount;
private AdvertPopupType currentType = AdvertPopupType.None;
public RewardAdHandler(string adUnitId)
{
this.adUnitId = adUnitId;
}
public void RegisterCallbacks()
{
MaxSdkCallbacks.Rewarded.OnAdLoadedEvent += OnAdLoaded;
MaxSdkCallbacks.Rewarded.OnAdLoadFailedEvent += OnAdLoadFailed;
MaxSdkCallbacks.Rewarded.OnAdDisplayedEvent += OnAdDisplayed;
MaxSdkCallbacks.Rewarded.OnAdDisplayFailedEvent += OnAdDisplayFailed;
MaxSdkCallbacks.Rewarded.OnAdHiddenEvent += OnAdHidden;
MaxSdkCallbacks.Rewarded.OnAdClickedEvent += OnAdClicked;
MaxSdkCallbacks.Rewarded.OnAdReceivedRewardEvent += OnAdReceivedReward;
MaxSdkCallbacks.Rewarded.OnAdRevenuePaidEvent += OnAdRevenuePaid;
}
public void UnregisterCallbacks()
{
MaxSdkCallbacks.Rewarded.OnAdLoadedEvent -= OnAdLoaded;
MaxSdkCallbacks.Rewarded.OnAdLoadFailedEvent -= OnAdLoadFailed;
MaxSdkCallbacks.Rewarded.OnAdDisplayedEvent -= OnAdDisplayed;
MaxSdkCallbacks.Rewarded.OnAdDisplayFailedEvent -= OnAdDisplayFailed;
MaxSdkCallbacks.Rewarded.OnAdHiddenEvent -= OnAdHidden;
MaxSdkCallbacks.Rewarded.OnAdClickedEvent -= OnAdClicked;
MaxSdkCallbacks.Rewarded.OnAdReceivedRewardEvent -= OnAdReceivedReward;
MaxSdkCallbacks.Rewarded.OnAdRevenuePaidEvent -= OnAdRevenuePaid;
}
public void TryLoad(string triggerSource)
{
if (isLoadTriggered || MaxSdk.IsRewardedAdReady(adUnitId))
return;
isLoadTriggered = true;
AdsEventLogger.LogLoadStart("reward", adUnitId, triggerSource);
AdsEventLogger.SetCrashFlag("reward", "load");
MaxSdk.LoadRewardedAd(adUnitId);
}
public void Show(AdvertPopupType advertPopupType)
{
if (advertPopupType == AdvertPopupType.None) return;
currentType = advertPopupType;
using (var e = GEvent.GameEvent("ads_reward_click"))
{
e.AddContent("ad_unit_id", adUnitId);
e.AddContent("placement", advertPopupType.ToString());
}
if (MaxSdk.IsRewardedAdReady(adUnitId))
{
MaxSdk.ShowRewardedAd(adUnitId, advertPopupType.ToString());
}
else
{
GContext.Publish(new AdsResult() { Result = 1, Type = advertPopupType });
AdsEventLogger.LogNotReady("reward", advertPopupType.ToString());
ToastPanel.Show(LocalizationMgr.GetText("UI_ToastPanel_27"));
}
}
private void OnAdLoaded(string adUnitId, MaxSdkBase.AdInfo adInfo)
{
retryCount = 0;
AdsEventLogger.ClearCrashFlag();
AdsEventLogger.LogLoadSuccess("reward", adUnitId, adInfo.Placement);
}
private async void OnAdLoadFailed(string adUnitId, MaxSdkBase.ErrorInfo errorInfo)
{
retryCount++;
if(retryCount > 5)
{
AdsEventLogger.ClearCrashFlag();
}
int retryDelay = Math.Min(6, retryCount) * 2000;
UnityEngine.Debug.LogWarning($"[RewardAdHandler] Load failed, retry {retryDelay}ms, attempt {retryCount}, {errorInfo}");
AdsEventLogger.LogLoadFail("reward", adUnitId, retryCount, errorInfo.Code.ToString(), errorInfo.Message);
await Task.Delay(retryDelay);
MaxSdk.LoadRewardedAd(adUnitId);
}
private void OnAdDisplayed(string adUnitId, MaxSdkBase.AdInfo adInfo)
{
AdsEventLogger.ClearCrashFlag();
AdsEventLogger.SetCrashFlag("reward", "display");
AdsEventLogger.LogDisplay("reward", adUnitId, adInfo.Placement);
}
private void OnAdDisplayFailed(string adUnitId, MaxSdkBase.ErrorInfo errorInfo, MaxSdkBase.AdInfo adInfo)
{
AdsEventLogger.ClearCrashFlag();
AdvertPopupType type = GetAdvertPopupType(adInfo);
GContext.Publish(new AdsResult() { Result = 1, Type = type });
AdsEventLogger.LogDisplayFail("reward", adUnitId, adInfo.Placement, errorInfo.Code.ToString(), errorInfo.Message);
MaxSdk.LoadRewardedAd(adUnitId);
}
private void OnAdHidden(string adUnitId, MaxSdkBase.AdInfo adInfo)
{
AdsEventLogger.ClearCrashFlag();
AdsEventLogger.LogHidden("reward", adUnitId, adInfo.Placement);
MaxSdk.LoadRewardedAd(adUnitId);
}
private void OnAdClicked(string adUnitId, MaxSdkBase.AdInfo adInfo)
{
AdsEventLogger.LogClick("reward", adUnitId, adInfo.Placement);
}
private void OnAdReceivedReward(string adUnitId, MaxSdk.Reward reward, MaxSdkBase.AdInfo adInfo)
{
AdvertPopupType type = GetAdvertPopupType(adInfo);
GContext.Publish(new AdsResult() { Result = 0, Type = type });
AdsEventLogger.LogRewarded(adUnitId, adInfo.Placement);
}
private void OnAdRevenuePaid(string adUnitId, MaxSdkBase.AdInfo adInfo)
{
GEvent.ADRevenueEvent(adUnitId, adInfo);
}
private AdvertPopupType GetAdvertPopupType(MaxSdkBase.AdInfo adInfo)
{
if (adInfo != null && Enum.TryParse(adInfo.Placement, out AdvertPopupType type))
return type;
return currentType;
}
}
}