Files
SVSimServer/SVSim.BattleEngine/Engine/PaymentImpl.cs
gamer147 824309ec44 feat(battle-engine): close the AI-simulation subsystem (verbatim)
Copied the 89 uncopied AI*SimulationUtility/extension files defining the
AIVirtualCard/AIVirtualField extension methods; the compile loop then auto-closed
the revealed type deps (~3049 files total, drift-clean). 10.0k -> 62 errors.
2026-06-05 20:30:59 -04:00

586 lines
16 KiB
C#

using System;
using System.Collections.Generic;
using Cute;
using Cute.Payment;
using UnityEngine;
using Wizard;
public class PaymentImpl : PaymentBase, IPaymentCallback, IPaymentCommonCallback
{
public enum PaymentOriginalScreen
{
SHOP_PLUS,
MYPAGE,
NONE
}
public List<string> ProductIdList;
public List<string> IdList;
public Dictionary<string, string> ProductPriceList;
public Dictionary<string, string> FormatProductPriceList;
public Dictionary<string, string> ProductNameList;
public Dictionary<string, string> ProductTextList;
public Dictionary<string, string> ProductPurchaseLimitList;
public Dictionary<string, string> ProductPurchaseNumberList;
public Dictionary<string, string> ProductCsvIdList;
public Dictionary<string, string> ProductImageNameList;
public Dictionary<string, bool> ProductIsSpecialShop;
public Dictionary<string, int> ProductCurrentPurchaseCount;
public Dictionary<string, int> ProductPurchaseLimitCount;
public Dictionary<string, string> ProductEndTime;
private string lastErrorMethod;
private string lastErrorMessage;
private long lastLogTimeTicks = DateTime.Now.Ticks;
private int sameLogCount;
public PaymentOriginalScreen PaymentFromScreen;
public List<PaymentSkuInfo> skuInfos;
public string selectedStoreProductId;
public List<PaymentPurchase> lastSucceededPurchases = new List<PaymentPurchase>();
public int resumePurchaseTransactionCount;
public bool inProcessingResumePurchaseTransaction;
public bool inProcessingPurchaseTransaction;
public bool isPaymentListErrorDialogOpen;
private bool _receivePaymentSuccess;
private bool _receivePaymentCancel;
private static PaymentImpl instance;
private bool isCountTime;
private bool isCountTimeForProductListInit;
private float timer;
public string StoreProductCountryCode { get; private set; }
public string StoreProductCurrencyCode { get; private set; }
public bool IsRefundedReceipt { get; private set; }
public PaymentUI paymentUI { get; private set; }
public event Action ProductListSucceeded;
public event Action ProductListFailed;
public event Action<string> FinishFailureEvent;
public event Action<NetworkTask.ResultCode> purchaseFinishSuccessEvent;
public event Action<NetworkTask.ResultCode> purchaseFinishHttpErrorEvent;
public event Action<int> purchaseFinishResultCodeErrorEvent;
public event Action purchaseRetryResultEvent;
public event Action ConsumePurchaseSucceeded;
private void Awake()
{
if (paymentUI == null)
{
paymentUI = new PaymentUI();
}
}
private void Update()
{
if (isCountTime)
{
checkTimeOut();
}
}
public static PaymentImpl GetInstance()
{
if (instance == null)
{
GameObject obj = new GameObject("PaymentImpl");
UnityEngine.Object.DontDestroyOnLoad(obj);
instance = obj.AddComponent<PaymentImpl>();
}
return instance;
}
private void OnItemListFailure(NetworkTask.ResultCode code)
{
Debug.LogError("OnItemListFailure" + code);
Debug.LogError("プロダクトIDリストリクエストが失敗しました。やり直してください。");
}
private void OnItemListResultCodeError(int code)
{
Debug.LogError("OnItemListResultCodeError" + code);
this.ProductListFailed.Call();
}
private void OnFinishSuccess(NetworkTask.ResultCode code)
{
string[] array = new string[lastSucceededPurchases.Count];
for (int i = 0; i < lastSucceededPurchases.Count; i++)
{
array[i] = lastSucceededPurchases[i].getProductId();
}
string orderId = ((lastSucceededPurchases.Count > 0) ? lastSucceededPurchases[0].getOrderId() : "");
Payment.consumePurchase(array, orderId);
}
private void OnFinishFailure(NetworkTask.ResultCode code)
{
paymentUI.StopLoading();
Debug.LogError("OnFinishFailure:" + code);
if (this.purchaseFinishHttpErrorEvent != null)
{
this.purchaseFinishHttpErrorEvent(code);
}
inProcessingPurchaseTransaction = false;
}
private void OnFinishResultCodeError(int resultCode)
{
paymentUI.StopLoading();
Debug.LogError("OnFinishResultCodeError" + resultCode);
Debug.LogError("チェック不正です。");
if (this.purchaseFinishResultCodeErrorEvent != null)
{
this.purchaseFinishResultCodeErrorEvent(resultCode);
}
inProcessingPurchaseTransaction = false;
}
public void OnPaymentCancelByRefundWarningDialog()
{
inProcessingPurchaseTransaction = false;
}
public void evInitializeSucceeded()
{
paymentUI.StopLoading();
Payment.getProductList(ProductIdList.ToArray());
}
public void OnInitializeSucceeded()
{
evInitializeSucceeded();
}
public void evInitializeFailed(string error)
{
paymentUI.StopLoading();
if (BattleManagerBase.GetIns() == null)
{
sendPaymentErrorLog("evInitializeFailed", error);
this.ProductListFailed.Call();
}
}
public void OnInitializeFailed(int errorCode, string errorMessage)
{
evInitializeFailed(errorMessage);
}
public void evPurchaseSucceeded(PaymentPurchase purchase)
{
if (BattleManagerBase.GetIns() == null)
{
paymentUI.StopLoading();
_receivePaymentSuccess = true;
lastSucceededPurchases.Add(purchase);
selectedStoreProductId = purchase.getProductId();
}
}
public void OnPurchaseFailed(string error)
{
evPurchaseFailed(error);
}
public void OnPurchaseFailed(int errorCode, string errorMessage)
{
evPurchaseFailed(errorCode + ":" + errorMessage);
}
public void evPurchaseFailed(string error)
{
if (BattleManagerBase.GetIns() != null)
{
return;
}
paymentUI.StopLoading();
string message = paymentUI.GetText("Shop_0072");
if (_receivePaymentCancel)
{
return;
}
_receivePaymentCancel = true;
PaymentCancelTask paymentCancelTask = new PaymentCancelTask();
paymentCancelTask.SetParameter(getSkuInfo(GetInstance().selectedStoreProductId), error);
StartCoroutine(Toolbox.NetworkManager.Connect(paymentCancelTask, delegate
{
if (!error.Contains("Received a pending purchase of SKU:") && !_receivePaymentSuccess)
{
if (this.FinishFailureEvent != null)
{
this.FinishFailureEvent(message);
}
else
{
paymentUI.PurchaseFailed();
}
}
}, delegate
{
}, delegate(int code)
{
Debug.LogError("OnPurchaseFailedCancelTaskResultCodeError" + code);
}));
inProcessingPurchaseTransaction = false;
}
public void OnPurchaseCancelled(string productId, string price, string currencyCode)
{
evPurchaseCancelled("");
}
public void evPurchaseCancelled(string error)
{
paymentUI.StopLoading();
string message = paymentUI.GetText("Shop_0073");
PaymentCancelTask paymentCancelTask = new PaymentCancelTask();
paymentCancelTask.SetParameter(getSkuInfo(GetInstance().selectedStoreProductId), error);
StartCoroutine(Toolbox.NetworkManager.Connect(paymentCancelTask, delegate
{
if (this.FinishFailureEvent != null)
{
this.FinishFailureEvent(message);
}
else
{
paymentUI.PurchaseCancelled();
}
}, delegate
{
}, delegate(int code)
{
Debug.LogError("OnCancelResultCodeError" + code);
}));
inProcessingPurchaseTransaction = false;
}
public void OnGetProductListSucceeded(List<PaymentSkuInfo> productInfo, bool waitUnfinishedTransaction)
{
evGetProductListSucceeded(productInfo);
}
public void evGetProductListSucceeded(List<PaymentSkuInfo> infos)
{
skuInfos = infos;
string text = "アイテムリストを取得しました" + Environment.NewLine;
ProductPriceList.Clear();
FormatProductPriceList.Clear();
int count = infos.Count;
for (int i = 0; i < count; i++)
{
ProductPriceList.Add(infos[i].productId, infos[i].price);
FormatProductPriceList.Add(infos[i].productId, infos[i].formattedPrice);
StoreProductCountryCode = infos[i].currencyCode;
StoreProductCurrencyCode = infos[i].currencyCode;
if (!string.IsNullOrEmpty(StoreProductCountryCode))
{
PlayerPrefsWrapper.SetValue(PlayerPrefsWrapper.CURRENT_REGION_CODE, StoreProductCountryCode);
}
text = text + " " + infos[i].title + " : " + infos[i].formattedPrice + Environment.NewLine;
}
if (!inProcessingResumePurchaseTransaction)
{
paymentUI.StopLoading();
}
}
public void OnGetProductListFailed(int errorCode, string errorMessage)
{
evGetProductListFailed(errorCode + ":" + errorMessage);
}
public void evGetProductListFailed(string error)
{
paymentUI.StopLoading();
if (BattleManagerBase.GetIns() == null)
{
sendPaymentErrorLog("evGetProductListFailed", error);
this.ProductListFailed.Call();
inProcessingPurchaseTransaction = false;
}
}
public void OnConsumePurchaseSucceeded()
{
evConsumePurchaseSucceeded();
}
public void evConsumePurchaseSucceeded()
{
paymentUI.StopLoading();
lastSucceededPurchases.Clear();
this.ConsumePurchaseSucceeded.Call();
inProcessingPurchaseTransaction = false;
}
public void OnConsumePurchaseFailed(int errorCode, string errorMessage)
{
evConsumePurchaseFailed(errorCode + ":" + errorMessage);
}
public void evConsumePurchaseFailed(string error)
{
paymentUI.StopLoading();
sendPaymentErrorLog("evConsumePurchaseFailed", error);
inProcessingPurchaseTransaction = false;
}
public void evConsumePurchaseSucceedediOS()
{
}
public void TryToShowBuyResultPopUp(int amount, int sum, bool isRefundedReceipt = false)
{
IsRefundedReceipt = isRefundedReceipt;
if (this.purchaseFinishSuccessEvent != null)
{
this.purchaseFinishSuccessEvent(NetworkTask.ResultCode.Success);
return;
}
string value = "";
ProductNameList.TryGetValue(selectedStoreProductId, out value);
paymentUI.PurchaseFinished(value, amount, sum, isRefundedReceipt);
}
public void TryToShowBuyResultPopUpSecond(bool isRefundedReceipt = false)
{
IsRefundedReceipt = isRefundedReceipt;
string value = "";
ProductNameList.TryGetValue(selectedStoreProductId, out value);
paymentUI.PurchaseFinished(value, 0, 0, isRefundedReceipt);
if (this.purchaseRetryResultEvent != null)
{
this.purchaseRetryResultEvent();
}
}
public override void purchaceStart(string storeProductId, bool isFromAlert = false)
{
if (inProcessingPurchaseTransaction)
{
return;
}
inProcessingPurchaseTransaction = true;
string message = "";
if (false)
{
sendPaymentErrorLog("purchaceStart", message);
if (this.FinishFailureEvent != null)
{
string text = paymentUI.GetText("Shop_0072");
this.FinishFailureEvent(string.Format(text, resumePurchaseTransactionCount));
}
else
{
paymentUI.PurchaseFailed();
}
inProcessingPurchaseTransaction = false;
return;
}
_receivePaymentSuccess = false;
_receivePaymentCancel = false;
bool isAlertOn = PlayerPrefsWrapper.GetBool(PlayerPrefsWrapper.PURCHASE_ALERT);
if (!isFromAlert)
{
IsAlertAgree = false;
}
PaymentStartTask task = new PaymentStartTask();
task.SetParameter(getSkuInfo(storeProductId), IsAlertAgree, isAlertOn);
task.SkipAllCuteResultCodeCheckErrorPopup();
StartCoroutine(Toolbox.NetworkManager.Connect(task, delegate
{
Payment.purchaseProduct(storeProductId, task.NeedRefundWarningType);
}, delegate
{
inProcessingPurchaseTransaction = false;
}, delegate(int code)
{
inProcessingPurchaseTransaction = false;
if (code == 329)
{
if (isAlertOn)
{
SystemText systemText = Data.SystemText;
DialogBase dialogBase = UIManager.GetInstance().CreateDialogClose();
dialogBase.SetSize(DialogBase.Size.S);
dialogBase.SetTitleLabel(systemText.Get("ErrorHeader_0329"));
dialogBase.SetText(systemText.Get("Error_0329"));
dialogBase.SetButtonText(systemText.Get("Shop_0082"));
dialogBase.SetFadeButtonEnabled(flag: false);
dialogBase.SetButtonLayout(DialogBase.ButtonLayout.BlueBtn_CancelBtn);
dialogBase.SetPanelDepth(6000);
dialogBase.SetPanelSortingOrder(2);
dialogBase.SetButtonDelegate(new EventDelegate(delegate
{
CallPaymentStartFromAlert(storeProductId);
}));
}
else
{
CallPaymentStartFromAlert(storeProductId);
}
}
else
{
Toolbox.NetworkManager.NetworkUI.OpenCloseOnlyErrorPopUp(code);
}
}));
selectedStoreProductId = storeProductId;
}
public void initialize()
{
if (!inProcessingPurchaseTransaction)
{
this.ProductListSucceeded = null;
this.ProductListFailed = null;
this.FinishFailureEvent = null;
this.purchaseFinishSuccessEvent = null;
this.purchaseFinishHttpErrorEvent = null;
this.purchaseFinishResultCodeErrorEvent = null;
this.purchaseRetryResultEvent = null;
this.ConsumePurchaseSucceeded = null;
ProductIdList = new List<string>();
IdList = new List<string>();
ProductNameList = new Dictionary<string, string>();
ProductPriceList = new Dictionary<string, string>();
FormatProductPriceList = new Dictionary<string, string>();
ProductTextList = new Dictionary<string, string>();
ProductPurchaseLimitList = new Dictionary<string, string>();
ProductPurchaseNumberList = new Dictionary<string, string>();
ProductCsvIdList = new Dictionary<string, string>();
ProductImageNameList = new Dictionary<string, string>();
ProductIsSpecialShop = new Dictionary<string, bool>();
ProductCurrentPurchaseCount = new Dictionary<string, int>();
ProductPurchaseLimitCount = new Dictionary<string, int>();
lastSucceededPurchases = new List<PaymentPurchase>();
ProductEndTime = new Dictionary<string, string>();
PaymentItemListTask task = new PaymentItemListTask();
StartCoroutine(Toolbox.NetworkManager.Connect(task, delegate
{
Payment.initialize(GetInstance(), "");
}, OnItemListFailure, OnItemListResultCodeError));
}
}
public void finalize()
{
inProcessingPurchaseTransaction = false;
inProcessingResumePurchaseTransaction = false;
resumePurchaseTransactionCount = 0;
this.ProductListSucceeded = null;
this.ProductListFailed = null;
this.FinishFailureEvent = null;
this.purchaseFinishSuccessEvent = null;
this.purchaseFinishHttpErrorEvent = null;
this.purchaseFinishResultCodeErrorEvent = null;
this.purchaseRetryResultEvent = null;
this.ConsumePurchaseSucceeded = null;
Payment.finalize();
}
public void StartTimeCount(bool forProductListInit = false)
{
isCountTime = true;
isCountTimeForProductListInit = forProductListInit;
}
public void StopTimeCount()
{
isCountTime = false;
timer = 0f;
}
private void checkTimeOut()
{
timer += Time.deltaTime;
if (!(timer >= 30f))
{
return;
}
timer = 0f;
paymentUI.StopLoading();
if (isCountTimeForProductListInit)
{
if (PaymentFromScreen == PaymentOriginalScreen.SHOP_PLUS)
{
paymentUI.ProductListInitTimeOut();
}
}
else
{
paymentUI.PurchaseTimeOut();
}
}
public PaymentSkuInfo getSkuInfo(PaymentPurchase purchase)
{
return skuInfos.Find((PaymentSkuInfo x) => x.productId == purchase.getProductId());
}
public PaymentSkuInfo getSkuInfo(string productId)
{
return skuInfos.Find((PaymentSkuInfo x) => x.productId == productId);
}
public bool isGoogleReward(string productId)
{
return productId.EndsWith(".rew");
}
private void sendPaymentErrorLog(string method, string message)
{
long ticks = DateTime.Now.Ticks;
if (method == lastErrorMethod && message == lastErrorMessage && ticks - lastLogTimeTicks < 600000000)
{
sameLogCount++;
return;
}
LocalLog.AccumulateTraceLog(((sameLogCount > 0) ? $"same log : {sameLogCount}\n" : string.Empty) + "\n method:" + method + " message: " + message);
lastLogTimeTicks = ticks;
lastErrorMethod = method;
lastErrorMessage = message;
sameLogCount = 0;
}
}