Example #1
0
        public async Task <EConnectionResult> WaitForLogin(bool reconnect = false, CancellationToken cancellationToken = default)
        {
            try
            {
                // the login semaphore only allows one login attempt simultaneously
                await _loginSemaphore.WaitAsync(cancellationToken);

                // check if we are already connected
                if (!reconnect && _connectionStatus == EConnectionResult.Connected)
                {
                    return(EConnectionResult.Connected);
                }

                _connectionStatus = EConnectionResult.Connecting;

                // var connectionResult = EConnectionResult.Disconnected;

                var retryStarted = false;

                while (_connectionStatus != EConnectionResult.Connected)
                {
                    _connectionStatus = await LoginAsync(retryStarted, cancellationToken);

                    switch (_connectionStatus)
                    {
                    case EConnectionResult.InvalidCredentials:
                        _logger.LogWarning("Invalid credentials... terminating service.");

                        var applicationLifetime = _host.Services.GetService <IHostApplicationLifetime>();
                        applicationLifetime.StopApplication();
                        return(EConnectionResult.InvalidCredentials);

                    case EConnectionResult.InvalidLocation:
                        if (!retryStarted)
                        {
                            _logger.LogWarning("Invalid location... web server might be down... retrying...");
                        }

                        break;

                    case EConnectionResult.Connected:
                        break;

                    default:
                        if (!retryStarted)
                        {
                            _logger.LogWarning($"Error:  Login returned {_connectionStatus}.. retrying...");
                        }

                        break;
                    }

                    await Task.Delay(5000, cancellationToken);

                    retryStarted = true;
                }
            }
            finally
            {
                try
                {
                    _loginSemaphore.Release();
                }
                catch (ObjectDisposedException) {}
            }

            return(EConnectionResult.Connected);
        }
Example #2
0
 public void ResetConnection()
 {
     _connectionStatus = EConnectionResult.Disconnected;
 }