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; } } }