Beispiel #1
0
        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();
                }
            }
        }
Beispiel #2
0
 public void OnError(Gs2Exception e)
 {
     if (e.Errors[0].message == "account.account.account.error.notAuthorized")
     {
         Debug.Log("アカウントの認証に失敗したため、アカウントを削除します");
         _repository.DeleteAccount();
     }
 }
Beispiel #3
0
        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));
        }
Beispiel #4
0
 public void OnError(Gs2Exception e)
 {
     Debug.Log(e);
 }
Beispiel #5
0
 private void OnError(Gs2Exception exception)
 {
     GameObject.Find("Gs2QuestInternalSetting").GetComponent <Gs2QuestInternalSetting>().onClosePlayGame.Invoke(
         this
         );
 }
Beispiel #6
0
        /// <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;
 }
Beispiel #8
0
 void OnError(Gs2Exception e)
 {
     onWatchPushJob.Invoke();
 }
Beispiel #9
0
 public Gs2Response(Gs2Exception error)
 {
     Message = null;
     Error   = error;
 }
Beispiel #10
0
 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);
        }