protected void OpenCallback(string projectToken, Gs2Exception e) { if (projectToken == null && e == null) { // 応答からプロジェクトトークンが取得できなかった場合 // そのまま Idle 状態に遷移するので、 Open 失敗の後始末が必要な場合は派生クラスで対応が必要 e = new UnknownException("No project token returned."); } using (var scopedLock = new NonreentrantLock.ScopedLock(_lock)) { if (e == null) { ProjectToken = projectToken; _state = State.Available; CompleteOpenTasks(new AsyncResult <OpenResult>(new OpenResult(), null)); } else { // キャンセルがかけられていれば、実際の失敗の内容が何であれ、キャンセルによる失敗として扱う if (_state == State.CancellingOpen) { e = new SessionNotOpenException("Cancelled."); } _state = State.Idle; // TODO: Open と Close のコールバックの順番の保証 CompleteOpenTasks(new AsyncResult <OpenResult>(null, e)); CompleteCloseTasks(); } } }
public void OnError(Gs2Exception e) { if (e.Errors[0].message == "account.account.account.error.notAuthorized") { Debug.Log("アカウントの認証に失敗したため、アカウントを削除します"); _repository.DeleteAccount(); } }
public IEnumerator Buy( UnityAction <AsyncResult <PurchaseParameters> > callback, string contentsId ) { if (_status != Status.None) { callback.Invoke( new AsyncResult <PurchaseParameters>( null, new ConflictException( new List <RequestError> { new RequestError("state", "money.state.state.error.running") } ) ) ); yield break; } _exception = null; _receipt = null; _status = Status.Initializing; var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance()); var ids = new IDs { { contentsId, contentsId } }; builder.AddProduct(contentsId, ProductType.Consumable, ids); UnityPurchasing.Initialize(new Gs2StoreListener(this), builder); while (_status == Status.Initializing) { yield return(new WaitForSeconds(1)); } if (_status == Status.InitializeFailed) { callback.Invoke(new AsyncResult <PurchaseParameters>(null, _exception)); yield break; } _status = Status.Purchasing; _controller.InitiatePurchase(_controller.products.WithID(contentsId)); while (_status == Status.Purchasing) { yield return(new WaitForSeconds(1)); } callback.Invoke(new AsyncResult <PurchaseParameters>( new PurchaseParameters { receipt = _receipt, controller = _controller, product = _controller.products.WithID(contentsId), }, _exception)); }
public void OnError(Gs2Exception e) { Debug.Log(e); }
private void OnError(Gs2Exception exception) { GameObject.Find("Gs2QuestInternalSetting").GetComponent <Gs2QuestInternalSetting>().onClosePlayGame.Invoke( this ); }
/// <summary> /// スタミナを購入する /// </summary> /// <param name="callback"></param> /// <returns></returns> public IEnumerator Buy( UnityAction <AsyncResult <object> > callback ) { var request = Gs2Util.LoadGlobalGameObject <StaminaRequest>("StaminaRequest"); string stampSheet = null; { AsyncResult <EzExchangeResult> result = null; yield return(gs2Client.client.Exchange.Exchange( r => { result = r; }, request.gameSession, gs2StaminaSetting.exchangeNamespaceName, gs2StaminaSetting.exchangeRateName, 1, new List <Gs2.Unity.Gs2Exchange.Model.EzConfig> { new Gs2.Unity.Gs2Exchange.Model.EzConfig { Key = "slot", Value = MoneyController.Slot.ToString(), } } )); if (result.Error != null) { gs2StaminaSetting.onError.Invoke( result.Error ); callback.Invoke(new AsyncResult <object>(null, result.Error)); yield break; } stampSheet = result.Result.StampSheet; } { var machine = new StampSheetStateMachine( stampSheet, gs2Client.client, gs2StaminaSetting.distributorNamespaceName, gs2StaminaSetting.exchangeKeyId ); Gs2Exception exception = null; void OnError(Gs2Exception e) { exception = e; } gs2StaminaSetting.onError.AddListener(OnError); yield return(machine.Execute(gs2StaminaSetting.onError)); gs2StaminaSetting.onError.RemoveListener(OnError); if (exception != null) { callback.Invoke(new AsyncResult <object>(null, exception)); yield break; } } gs2StaminaSetting.onBuy.Invoke(); callback.Invoke(new AsyncResult <object>(null, null)); }
public AsyncResult(T result, Gs2Exception e) { Result = result; Error = e; }
void OnError(Gs2Exception e) { onWatchPushJob.Invoke(); }
public Gs2Response(Gs2Exception error) { Message = null; Error = error; }
protected Gs2Response(string message) { Message = message; Error = null; }
private WebSocket CreateWebSocket() { var url = EndpointHost.Replace("{region}", Region.DisplayName()); var webSocket = new WebSocket(url) { SslConfiguration = { EnabledSslProtocols = SslProtocols.Tls12, CheckCertificateRevocation = _checkCertificateRevocation } }; webSocket.OnOpen += (sender, eventArgs) => { _state = State.LoggingIn; webSocket.SendAsync( "{" + $"\"client_id\": \"{Credential.ClientId}\"," + $"\"client_secret\": \"{Credential.ClientSecret}\"," + "\"x_gs2\": {" + "\"service\": \"identifier\"," + "\"component\": \"projectToken\"," + "\"function\": \"login\"," + "\"contentType\": \"application/json\"," + $"\"requestId\": \"{Gs2SessionTaskId.LoginId.ToString()}\"" + "}" + "}", null ); }; webSocket.OnMessage += (sender, messageEventArgs) => { if (messageEventArgs.IsText) { var gs2WebSocketResponse = new Gs2WebSocketResponse(messageEventArgs.Data); switch (_state) { case State.LoggingIn: if (gs2WebSocketResponse.Gs2SessionTaskId == Gs2SessionTaskId.LoginId) { if (gs2WebSocketResponse.Error == null) { LoginResult loginResult = LoginResult.FromDict(gs2WebSocketResponse.Body); if (loginResult.access_token != null) { _state = State.Available; OpenCallback(loginResult.access_token, null); } else { _lastGs2Exception = new UnknownException("No project token returned."); _state = State.LoginFailed; webSocket.CloseAsync(); } } else { _lastGs2Exception = gs2WebSocketResponse.Error; _state = State.LoginFailed; webSocket.CloseAsync(); } } break; case State.Available: if (gs2WebSocketResponse.Gs2SessionTaskId == Gs2SessionTaskId.InvalidId) { // API 応答以外のメッセージ OnNotificationMessage?.Invoke( NotificationMessage.FromDict(gs2WebSocketResponse.Body) ); } else { OnMessage(gs2WebSocketResponse.Gs2SessionTaskId, gs2WebSocketResponse); } break; case State.Idle: case State.Opening: case State.LoginFailed: break; } } }; webSocket.OnClose += (sender, closeEventArgs) => { var state = _state; _state = State.Idle; switch (state) { case State.Idle: // 来ない break; case State.Opening: // TODO: OnError を通ってからくるか確認 case State.LoggingIn: case State.LoginFailed: // Gs2Session としては Available になっていないので closeCallback ではなく openCallback に失敗を伝える OpenCallback(null, _lastGs2Exception); break; case State.Available: // 自発的な切断も外部要因による切断もここ CloseCallback(); // TODO: Cancel にわたすエラーを引数に取る break; } }; webSocket.OnError += (sender, errorEventArgs) => { var gs2Exception = new SessionNotOpenException("Session no longer open."); switch (_state) { case State.Idle: // 来ない break; case State.Opening: // この直後に OnClose が呼ばれる _lastGs2Exception = gs2Exception; break; case State.LoggingIn: _lastGs2Exception = gs2Exception; _state = State.LoginFailed; webSocket.CloseAsync(); break; case State.LoginFailed: // 来ないはず break; case State.Available: // 実行中のタスクのどれが失敗したのかわからないので、全部失敗にする // TODO break; } }; return(webSocket); }