public void SwitchUser(AuthIdentity authIdentity, Action onSuccess, Action <GetSocialError> onFailure)
        {
            var request = new THSdkAuthRequest
            {
                AppId             = _stateController.AppId,
                SessionProperties = _stateController.SuperProperties
            };

            var identity = authIdentity.ToRpcModel();

            LogRequest("switchUser", identity);

            WithHadesClient(client =>
            {
                var user = client.getPrivateUserByIdentity(SessionId, identity);

                request.UserId   = user.Id;
                request.Password = user.Password;

                var response = client.authenticateSdk(request);

                Ui(() =>
                {
                    LogResponse("switchUser", response);
                    _stateController.SaveSession(response.SessionId, response.User);
                    onSuccess.SafeCall();
                });
            }, onFailure);
        }
        private void Init(THSdkAuthRequest request)
        {
            LogRequest("authenticateSdk", request);
            WithHadesClient(client =>
            {
                THSdkAuthResponseAllInOne response = null;
                while (response == null)
                {
                    try
                    {
                        try {
                            response = client.authenticateSdkAllInOne(new THSdkAuthRequestAllInOne
                            {
                                SdkAuthRequest        = request,
                                ProcessAppOpenRequest = new THProcessAppOpenRequest
                                {
                                }
                            });
                        }
                        catch (THErrors errors)
                        {
                            GetSocialLogs.W(errors.Errors.First().ErrorMsg);
                            throw errors; // if GetSocial exception - rethrow
                        }
                    }
                    catch (Exception exception)
                    {
                        // if system exception - try again
                        Ui(() => GetSocialLogs.W("Failed to init GetSocial, retry in 1 second, exception: " + exception));

                        // wait for 1 sec
                        Thread.Sleep(1000);

                        // unity doesn't stop background threads, so we have to check a state of app
                        if (!EngineUtils.IsApplicationRunning())
                        {
                            return;
                        }
                    }
                }
                Ui(() =>
                {
                    LogResponse("authenticateSdk", response);
                    _stateController.Initialized(response, request.AppId);
#if !UNITY_EDITOR
                    TrackAnalyticsEvent(new AnalyticsEvent
                    {
                        Name      = AnalyticsEventDetails.AppSessionStart,
                        CreatedAt = ApplicationStateListener.Instance.AppStartTime
                    });
#endif
                });
            }, requireInitialization: false);
        }
        public void Read(TProtocol iprot)
        {
            iprot.IncrementRecursionDepth();
            try
            {
                TField field;
                iprot.ReadStructBegin();
                while (true)
                {
                    field = iprot.ReadFieldBegin();
                    if (field.Type == TType.Stop)
                    {
                        break;
                    }
                    switch (field.ID)
                    {
                    case 1:
                        if (field.Type == TType.Struct)
                        {
                            SdkAuthRequest = new THSdkAuthRequest();
                            SdkAuthRequest.Read(iprot);
                        }
                        else
                        {
                            TProtocolUtil.Skip(iprot, field.Type);
                        }
                        break;

                    case 2:
                        if (field.Type == TType.Struct)
                        {
                            ProcessAppOpenRequest = new THProcessAppOpenRequest();
                            ProcessAppOpenRequest.Read(iprot);
                        }
                        else
                        {
                            TProtocolUtil.Skip(iprot, field.Type);
                        }
                        break;

                    default:
                        TProtocolUtil.Skip(iprot, field.Type);
                        break;
                    }
                    iprot.ReadFieldEnd();
                }
                iprot.ReadStructEnd();
            }
            finally
            {
                iprot.DecrementRecursionDepth();
            }
        }
        public void ResetUser(Action onSuccess, Action <GetSocialError> onError)
        {
            var request = new THSdkAuthRequest
            {
                AppId             = _stateController.AppId,
                SessionProperties = _stateController.SuperProperties
            };

            LogRequest("authenticateSdk", request);

            WithHadesClient(client =>
            {
                var response = client.authenticateSdk(request);

                Ui(() =>
                {
                    LogResponse("authenticateSdk", response);
                    _stateController.SaveSession(response.SessionId, response.User);
                    onSuccess.SafeCall();
                });
            }, onError);
        }