146 lines
5.6 KiB
C#
146 lines
5.6 KiB
C#
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<SigninData>();
|
|
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;
|
|
}
|
|
}
|
|
}
|