private void SwitchToDefaultAuthProvider()
 {
     if (mCurrentProvider != null && !(mCurrentProvider is DefaultAuthProvider))
     {
         mCurrentProvider.Dispose();
         mCurrentProvider = null;
     }
     if (mCurrentProvider == null)
     {
         mCurrentProvider = new DefaultAuthProvider();
     }
 }
        private void InvokeAuthFailCallback()
        {
            if (mAuthFailedCallback != null)
            {
                mAuthFailedCallback.Invoke();
            }

            mAuthSucceededCallback = null;
            mAuthFailedCallback    = null;

            mCurrentProvider?.Dispose();
            mCurrentProvider = null;
        }
        public static bool SetCurrentProvider(AuthProvider provider)
        {
            Debug.Log($"[SnipeAuthCommunicator] SetCurrentProvider - {provider?.ProviderId}");

            InitInstance();

            if (provider == null)
            {
                if (mInstance.mCurrentProvider != null)
                {
                    mInstance.mCurrentProvider.Dispose();
                    mInstance.mCurrentProvider = null;
                }
                return(false);
            }

            if (mInstance.mCurrentProvider == provider || mInstance.mCurrentProvider?.ProviderId == provider?.ProviderId)
            {
                return(true);
            }

            if (mInstance.mAuthProviders != null)
            {
                if (mInstance.mAuthProviders.IndexOf(provider) >= 0)
                {
                    if (mInstance.mCurrentProvider != null)
                    {
                        mInstance.mCurrentProvider.Dispose();
                    }

                    mInstance.mCurrentProvider = provider;
                    return(true);
                }
                else
                {
                    var added_provider = GetAuthProvider(provider.ProviderId);
                    if (added_provider != null)
                    {
                        if (mInstance.mCurrentProvider != null)
                        {
                            mInstance.mCurrentProvider.Dispose();
                        }

                        mInstance.mCurrentProvider = added_provider;
                        return(true);
                    }
                }
            }

            return(false);
        }
        /// <summary>
        /// Clear all auth data an authorize using specified <c>AuthProvider</c>.
        /// </summary>
        public void ClearAuthDataAndSetCurrentProvider(AuthProvider provider)
        {
            PlayerPrefs.DeleteKey(SnipePrefs.LOGIN_USER_ID);

            foreach (BindProvider bind_provider in mAuthProviders)
            {
                if (bind_provider != null)
                {
                    bind_provider.IsBindDone = false;
                }
            }

            SetCurrentProvider(provider);
        }
        private void OnCurrentProviderAuthSuccess(int user_id, string login_token)
        {
            UserID     = user_id;
            LoginToken = login_token;

            InvokeAuthSuccessCallback();

            ResetCheckLoginTokenExpiryCoroutine();

            mCurrentProvider?.Dispose();
            mCurrentProvider = null;

            BindAllProviders(mRebindAllProviders);
            mRebindAllProviders = false;
        }
        public void Authorize <ProviderType>(AuthResultCallback callback = null) where ProviderType : AuthProvider
        {
            mCurrentProvider = GetAuthProvider <ProviderType>();

            if (mCurrentProvider == null)
            {
                DebugLogger.Log("[SnipeAuthCommunicator] Authorize<ProviderType> - provider not found");

                callback?.Invoke(SnipeErrorCodes.NOT_INITIALIZED, 0);

                return;
            }

            AuthorizeWithCurrentProvider(callback);
        }
        public void Authorize(bool reset, AuthResultCallback callback = null)
        {
            if (reset)             // forget previous provider and start again from the beginning
            {
                AuthProvider prev_provider = mCurrentProvider;

                mCurrentProvider = null;
                SwitchToNextAuthProvider();

                if (prev_provider != mCurrentProvider)
                {
                    prev_provider.Dispose();
                }
            }

            Authorize(callback);
        }
        public static void Authorize(bool reset, Action succeess_callback, Action fail_callback = null)
        {
            if (reset && mInstance != null)             // forget previous provider and start again from the beginning
            {
                ClearLoginToken();

                AuthProvider prev_provider = mInstance.mCurrentProvider;

                mInstance.mCurrentProvider = null;
                mInstance.SwitchToNextAuthProvider();

                if (prev_provider != mInstance.mCurrentProvider)
                {
                    prev_provider.Dispose();
                }
            }

            Authorize(succeess_callback, fail_callback);
        }
        private void OnCurrentProviderAuthResult(string error_code, int user_id = 0)
        {
            if (user_id != 0)
            {
                UserID = user_id;

                InvokeAuthSuccessCallback(user_id);

                mCurrentProvider?.Dispose();
                mCurrentProvider = null;

                BindAllProviders(mRebindAllProviders);
                mRebindAllProviders = false;
            }
            else
            {
                DebugLogger.Log("[SnipeAuthCommunicator] OnCurrentProviderAuthFail (" + (mCurrentProvider != null ? mCurrentProvider.ProviderId : "null") + ") error_code: " + error_code);

                mRebindAllProviders = false;

                if (mCurrentProvider is DefaultAuthProvider)
                {
                    if (error_code == SnipeErrorCodes.NOT_INITIALIZED || error_code == SnipeErrorCodes.NO_SUCH_USER)
                    {
                        RequestRegister();
                    }
                    else
                    {
                        InvokeAuthFailCallback(error_code);
                    }
                }
                else                  // try next provider
                {
                    if (mCurrentProvider != null)
                    {
                        mCurrentProvider.Dispose();
                    }

                    SwitchToNextAuthProvider();
                    CurrentProviderRequestAuth();
                }
            }
        }
 /// <summary>
 /// Clear all auth data an authorize using specified <c>AuthProvider</c>.
 /// </summary>
 public static void ClearAuthDataAndSetCurrentProvider(AuthProvider provider)
 {
     PlayerPrefs.DeleteKey(SnipePrefs.LOGIN_USER_ID);
     SnipeAuthCommunicator.ClearLoginToken();
     SnipeAuthCommunicator.SetCurrentProvider(provider);
 }