using System; using BigoAds.Scripts.Api; using BigoAds.Scripts.Api.Constant; namespace BigoAds.Scripts.Common { public class BigoBaseAd where T : BigoRequest { /// /// event for load ad success /// public event Action OnLoad; /// /// load ad failed with error code and error message /// public event Action OnLoadFailed; /// /// event for ad impression /// public event Action OnAdShowed; /// /// event for ad be clicked /// public event Action OnAdClicked; /// /// event for ad be closed /// public event Action OnAdDismissed; /// /// event for ad error /// public event Action OnAdError; private readonly string _slotId; private bool _isAdLoaded; protected readonly IBigoAd ADClient; public bool CallbackOnMainThread { get; set; } = true; private BigoAdBid _bid; protected BigoBaseAd(string id, IBigoAd adClient) { _slotId = id; ADClient = adClient; InitEvent(ADClient); } private void InitEvent(IBigoAd adClient) { adClient.OnLoad += InvokeOnLoad; adClient.OnLoadFailed += InvokeOnLoadFailed; adClient.OnAdShowed += InvokeOnAdShowed; adClient.OnAdClicked += InvokeOnAdClicked; adClient.OnAdDismissed += InvokeOnAdDismissed; adClient.OnAdError += InvokeOnAdError; } public void Load(T request) { if (_isAdLoaded) { InvokeOnLoad(); } if (string.IsNullOrEmpty(_slotId)) { InvokeOnLoadFailed(-1, "slotId must be not null"); return; } if (!BigoAdSdk.IsInitSuccess()) { InvokeOnLoadFailed(-1, "sdk has not init"); return; } ADClient?.Load(_slotId, request); } public virtual void Show() { _isAdLoaded = false; ADClient?.Show(); } public void DestroyAd() { ADClient?.Destroy(); } public bool IsLoaded() { return _isAdLoaded; } public bool IsExpired() { return ADClient == null ? false : ADClient.IsExpired(); } public string GetExtraInfo(String key) { return ADClient == null ? "" : ADClient.GetExtraInfo(key); } private void InvokeOnLoad() { OnLoad?.Invoke(); _isAdLoaded = true; } protected void InvokeOnLoadFailed(int errorCode, string errorMessage) { if (CallbackOnMainThread) { BigoDispatcher.PostTask((() => { OnLoadFailed?.Invoke(errorCode, errorMessage); })); } else { OnLoadFailed?.Invoke(errorCode, errorMessage); } } private void InvokeOnAdShowed() { if (CallbackOnMainThread) { BigoDispatcher.PostTask((() => { OnAdShowed?.Invoke(); })); } else { OnAdShowed?.Invoke(); } } private void InvokeOnAdClicked() { if (CallbackOnMainThread) { BigoDispatcher.PostTask((() => { OnAdClicked?.Invoke(); })); } else { OnAdClicked?.Invoke(); } } private void InvokeOnAdDismissed() { if (CallbackOnMainThread) { BigoDispatcher.PostTask((() => { OnAdDismissed?.Invoke(); })); } else { OnAdDismissed?.Invoke(); } } private void InvokeOnAdError(int errorCode, string errorMessage) { if (CallbackOnMainThread) { BigoDispatcher.PostTask((() => { OnAdError?.Invoke(errorCode, errorMessage); })); } else { OnAdError?.Invoke(errorCode, errorMessage); } } public BigoAdBid GetBid() { if (ADClient == null) return null; if (!ADClient.IsClientBidding()) return null; if (_bid == null) { _bid = new BigoAdBid(ADClient); } return _bid; } public class BigoAdBid : IClientBidding { protected readonly IBigoAd _ADClient; public BigoAdBid(IBigoAd ADClient) { _ADClient = ADClient; } /// get price public double getPrice() { return _ADClient == null ? 0 : _ADClient.getPrice(); } ///notify win public void notifyWin(double secPrice, string secBidder) { _ADClient?.notifyWin(secPrice, secBidder); } ///notify loss public void notifyLoss(double firstPrice, string firstBidder, BGAdLossReason lossReason) { _ADClient?.notifyLoss(firstPrice, firstBidder, lossReason); } } } }