using System; using CIG.Extensions; using CIG.Translation; using CIGEnums; using SUISS.Core; using UnityEngine; namespace CIG { public sealed class PurchaseHandler : MonoBehaviour { private void OnDestroy() { this.CancelInvoke(new Action(this.TryConsumingPurchases)); this.CancelInvoke(new Action(this.ValidatePurchases)); if (this._store != null) { this._store.PurchaseSuccessEvent -= this.OnPurchaseSuccess; this._store.PurchaseFailedEvent -= this.OnPurchaseFailed; this._store.PurchaseDeferredEvent -= this.OnPurchaseDeferred; this._store = null; } } public void Init(IAPStore store) { this._store = store; this._store.PurchaseSuccessEvent += this.OnPurchaseSuccess; this._store.PurchaseFailedEvent += this.OnPurchaseFailed; this._store.PurchaseDeferredEvent += this.OnPurchaseDeferred; this.TryConsumingPurchases(); this.InvokeRepeating(new Action(this.ValidatePurchases), 10f, 600f, true); } public void InitiatePurchase(CIG3StoreProduct product, Action purchaseCollectedCallback = null) { if (this._store == null) { UnityEngine.Debug.LogErrorFormat("Cannot initiate Purchase, PurchaseHandler was never initialized.", new object[0]); return; } //TODODO ¹ºÂòÖ±½Ó³É¹¦ this._store.FirePurchaseSuccessEvent(product); return; if (this._store.LoadingError == IAPStoreError.None) { if (this._purchaseProductPopup == null) { this._purchaseProductPopup = SingletonMonobehaviour.Instance.ShowOrUpdateGenericPopup(null, Localization.Key("please_wait"), Localization.Key("social_loading"), null, null, null, null, null, false); SingletonMonobehaviour.Instance.RegisterCriticalProcess(this); SingletonMonobehaviour.Instance.AddIAPInitiated(); this._purchaseCollectedCallback = purchaseCollectedCallback; this._store.InitiatePurchase(product); } else { UnityEngine.Debug.LogError("Purchase failed, Another purchase is still pending."); } } else { SingletonMonobehaviour.Instance.ShowOrUpdateGenericPopup(null, Localization.Key("purchase.failed_title"), Localization.Format(Localization.Key("purchase.failed_desc"), new ILocalizedString[] { this.StoreLoadingError }), Localization.Key("ok"), null, null, null, null, true); } } private void ValidatePurchases() { this._store.ValidatePurchases(); } private void TryConsumingPurchases() { CIG3StoreProduct[] unconsumedPurchases = this._store.UnconsumedPurchases; int num = unconsumedPurchases.Length; if (num == 0) { return; } if (SingletonMonobehaviour.Instance.PopupIsOpen()) { this.Invoke(new Action(this.TryConsumingPurchases), 60f, false); return; } for (int i = 0; i < num; i++) { this.ShowPurchaseSuccessPopup(unconsumedPurchases[i]); } } private void ShowPurchaseSuccessPopup(CIG3StoreProduct Product) { Action action = delegate () { this.OnConsumeProduct(Product, SingletonMonobehaviour.Instance.IAPShopProductConsumer); }; switch (Product.Category) { case StoreProductCategory.Shop: case StoreProductCategory.ShopSale: SingletonMonobehaviour.Instance.ShowOrUpdateGenericPopup(null, Localization.Key("build_purchase_succeeded_title"), Localization.Format(Localization.Key("build_purchase_succeeded_message"), new ILocalizedString[] { Product.Currencies.LocalizedString() }), Localization.Key("ok"), null, action, null, action, true); break; case StoreProductCategory.Packs: SingletonMonobehaviour.Instance.ShowOrUpdateGenericPopup(null, Localization.Key("build_purchase_succeeded_title"), Localization.Key("build_purchase_succeeded_title"), Localization.Key("ok"), null, action, null, action, true); break; case StoreProductCategory.Cranes: SingletonMonobehaviour.Instance.ShowOrUpdateGenericPopup(null, Localization.Key("build_purchase_succeeded_title"), Localization.Format(Localization.Key("crane_purchased"), new ILocalizedString[] { Localization.Integer(SingletonMonobehaviour.Instance.MaxBuildCount + 1) }), Localization.Key("ok"), null, action, null, action, true); break; default: break; } } private void OnConsumeProduct(CIG3StoreProduct Product, IProductConsumer productConsumer) { if (!productConsumer.ConsumeProduct(Product)) { return; } this._store.MarkPurchaseAsConsumed(Product); SingletonMonobehaviour.Instance.AddIAPPurchased(); StorageController.SaveAll(); productConsumer.FireProductConsumedEvent(Product); UnityEngine.Debug.Log("IAP handled, purchases marked as consumed."); if (this._purchaseCollectedCallback != null) { this._purchaseCollectedCallback(); this._purchaseCollectedCallback = null; } } private void OnPurchaseSuccess(CIG3StoreProduct Product) { if (this._purchaseProductPopup != null) { this._purchaseProductPopup.ClosePopup(null, true, true); this._purchaseProductPopup = null; } this.ShowPurchaseSuccessPopup(Product); SingletonMonobehaviour.Instance.UnregisterCriticalProcess(this); } private void OnPurchaseFailed(CIG3StoreProduct product, IAPStorePurchaseFailedError error) { if (this._purchaseProductPopup != null) { this._purchaseProductPopup.ClosePopup(null, true, true); this._purchaseProductPopup = null; } ILocalizedString localizedString; switch (error) { case IAPStorePurchaseFailedError.StoreLoadingError: localizedString = this.StoreLoadingError; goto IL_CA; case IAPStorePurchaseFailedError.PurchasingUnavailable: localizedString = Localization.Key("purchase.failed_purchasing_unavailable"); goto IL_CA; case IAPStorePurchaseFailedError.ExistingPurchasePending: localizedString = Localization.Key("purchase.failed_pending_purchase"); goto IL_CA; case IAPStorePurchaseFailedError.ProductUnavailable: localizedString = Localization.Key("purchase.failed_product_unavailable"); goto IL_CA; case IAPStorePurchaseFailedError.SignatureInvalid: localizedString = Localization.Key("purchase.failed_signature_invalid"); goto IL_CA; case IAPStorePurchaseFailedError.UserCancelled: localizedString = Localization.Key("purchase.failed_user_cancelled"); goto IL_CA; case IAPStorePurchaseFailedError.PaymentDeclined: localizedString = Localization.Key("purchase.failed_payment_declined"); goto IL_CA; } localizedString = Localization.EmptyLocalizedString; IL_CA: if (product != null) { if (error == IAPStorePurchaseFailedError.StoreLoadingError) { } else { } } SingletonMonobehaviour.Instance.ShowOrUpdateGenericPopup(null, Localization.Key("purchase.failed_title"), Localization.Format(Localization.Key("purchase.failed_desc"), new ILocalizedString[] { localizedString }), Localization.Key("ok"), null, null, null, null, true); SingletonMonobehaviour.Instance.UnregisterCriticalProcess(this); } private void OnPurchaseDeferred(CIG3StoreProduct product) { if (this._purchaseProductPopup != null) { this._purchaseProductPopup.ClosePopup(null, true, true); this._purchaseProductPopup = null; } SingletonMonobehaviour.Instance.UnregisterCriticalProcess(this); } private ILocalizedString StoreLoadingError { get { IAPStoreError loadingError = this._store.LoadingError; if (loadingError == IAPStoreError.PurchasingUnavailable) { return Localization.Key("purchase.failed_purchasing_unavailable"); } if (loadingError != IAPStoreError.StoreInitializing) { return Localization.EmptyLocalizedString; } return Localization.Key("purchase.failed_internet_connection"); } } private const float CONSUMPTION_RETRYTIME = 60f; private IAPStore _store; private GenericPopupState _purchaseProductPopup; private Action _purchaseCollectedCallback; } }