using asap.core; using GameCore; using System; using System.Threading.Tasks; namespace game { public class InterstitialAdHandler { private readonly string adUnitId; private bool isLoadTriggered; private int retryCount; private AdvertPopupType currentType = AdvertPopupType.None; public InterstitialAdHandler(string adUnitId) { this.adUnitId = adUnitId; } public void RegisterCallbacks() { MaxSdkCallbacks.Interstitial.OnAdLoadedEvent += OnAdLoaded; MaxSdkCallbacks.Interstitial.OnAdLoadFailedEvent += OnAdLoadFailed; MaxSdkCallbacks.Interstitial.OnAdDisplayedEvent += OnAdDisplayed; MaxSdkCallbacks.Interstitial.OnAdDisplayFailedEvent += OnAdDisplayFailed; MaxSdkCallbacks.Interstitial.OnAdHiddenEvent += OnAdHidden; MaxSdkCallbacks.Interstitial.OnAdClickedEvent += OnAdClicked; MaxSdkCallbacks.Interstitial.OnAdRevenuePaidEvent += OnAdRevenuePaid; } public void UnregisterCallbacks() { MaxSdkCallbacks.Interstitial.OnAdLoadedEvent -= OnAdLoaded; MaxSdkCallbacks.Interstitial.OnAdLoadFailedEvent -= OnAdLoadFailed; MaxSdkCallbacks.Interstitial.OnAdDisplayedEvent -= OnAdDisplayed; MaxSdkCallbacks.Interstitial.OnAdDisplayFailedEvent -= OnAdDisplayFailed; MaxSdkCallbacks.Interstitial.OnAdHiddenEvent -= OnAdHidden; MaxSdkCallbacks.Interstitial.OnAdClickedEvent -= OnAdClicked; MaxSdkCallbacks.Interstitial.OnAdRevenuePaidEvent -= OnAdRevenuePaid; } public void TryLoad() { if (isLoadTriggered || !CanLoadInterstitial() || MaxSdk.IsInterstitialReady(adUnitId)) return; isLoadTriggered = true; AdsEventLogger.LogLoadStart("interstitial", adUnitId, "internal"); AdsEventLogger.SetCrashFlag("interstitial", "load"); MaxSdk.LoadInterstitial(adUnitId); } public void Show(AdvertPopupType advertPopupType) { if (advertPopupType == AdvertPopupType.None) return; currentType = advertPopupType; using (var e = GEvent.GameEvent("ads_interstitial_click")) { e.AddContent("ad_unit_id", adUnitId); e.AddContent("placement", advertPopupType.ToString()); } if (MaxSdk.IsInterstitialReady(adUnitId)) { MaxSdk.ShowInterstitial(adUnitId, advertPopupType.ToString()); } else { GContext.Publish(new AdsInterstitialResult() { Type = advertPopupType }); AdsEventLogger.LogNotReady("interstitial", advertPopupType.ToString()); } } private bool CanLoadInterstitial() { SigninData signinData = GContext.container.Resolve(); return signinData != null && signinData.ShouldLoadSignInInterstitial(); } private void OnAdLoaded(string adUnitId, MaxSdkBase.AdInfo adInfo) { retryCount = 0; AdsEventLogger.ClearCrashFlag(); AdsEventLogger.LogLoadSuccess("interstitial", 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($"[InterstitialAdHandler] Load failed, retry {retryDelay}ms, attempt {retryCount}, {errorInfo}"); AdsEventLogger.LogLoadFail("interstitial", adUnitId, retryCount, errorInfo.Code.ToString(), errorInfo.Message); await Task.Delay(retryDelay); MaxSdk.LoadInterstitial(adUnitId); } private void OnAdDisplayed(string adUnitId, MaxSdkBase.AdInfo adInfo) { AdsEventLogger.ClearCrashFlag(); AdsEventLogger.SetCrashFlag("interstitial", "display"); AdsEventLogger.LogDisplay("interstitial", adUnitId, adInfo.Placement); } private void OnAdDisplayFailed(string adUnitId, MaxSdkBase.ErrorInfo errorInfo, MaxSdkBase.AdInfo adInfo) { AdsEventLogger.ClearCrashFlag(); AdvertPopupType type = GetAdvertPopupType(adInfo); GContext.Publish(new AdsInterstitialResult() { Type = type }); AdsEventLogger.LogDisplayFail("interstitial", adUnitId, adInfo.Placement, errorInfo.Code.ToString(), errorInfo.Message); MaxSdk.LoadInterstitial(adUnitId); } private void OnAdHidden(string adUnitId, MaxSdkBase.AdInfo adInfo) { AdsEventLogger.ClearCrashFlag(); AdvertPopupType type = GetAdvertPopupType(adInfo); GContext.Publish(new AdsInterstitialResult() { Type = type }); AdsEventLogger.LogHidden("interstitial", adUnitId, adInfo.Placement); MaxSdk.LoadInterstitial(adUnitId); } private void OnAdClicked(string adUnitId, MaxSdkBase.AdInfo adInfo) { AdsEventLogger.LogClick("interstitial", 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; } } }