| @@ -39,7 +39,6 @@ namespace Discord | |||
| private bool _isFirstLogSub; | |||
| private bool _isReconnecting; | |||
| private bool _isDisposed; | |||
| private string[] _scopes; | |||
| public API.DiscordRpcApiClient ApiClient { get; } | |||
| internal LogManager LogManager { get; } | |||
| @@ -150,33 +149,21 @@ namespace Discord | |||
| await _loggedOutEvent.InvokeAsync().ConfigureAwait(false); | |||
| } | |||
| /// <inheritdoc /> | |||
| public async Task ConnectAsync() | |||
| { | |||
| await _connectionLock.WaitAsync().ConfigureAwait(false); | |||
| try | |||
| { | |||
| _isReconnecting = false; | |||
| await ConnectInternalAsync(null).ConfigureAwait(false); | |||
| await ConnectInternalAsync().ConfigureAwait(false); | |||
| } | |||
| finally { _connectionLock.Release(); } | |||
| } | |||
| public async Task ConnectAndAuthorizeAsync(params string[] scopes) | |||
| private async Task ConnectInternalAsync(bool ignoreLoginCheck = false) | |||
| { | |||
| await _connectionLock.WaitAsync().ConfigureAwait(false); | |||
| try | |||
| { | |||
| _isReconnecting = false; | |||
| await ConnectInternalAsync(scopes).ConfigureAwait(false); | |||
| } | |||
| finally { _connectionLock.Release(); } | |||
| } | |||
| private async Task ConnectInternalAsync(string[] scopes) | |||
| { | |||
| if (scopes == null && LoginState != LoginState.LoggedIn) | |||
| if (LoginState != LoginState.LoggedIn) | |||
| throw new InvalidOperationException("You must log in before connecting or call ConnectAndAuthorizeAsync."); | |||
| _scopes = scopes; | |||
| if (_isFirstLogSub) | |||
| { | |||
| @@ -232,8 +219,7 @@ namespace Discord | |||
| await _rpcLogger.DebugAsync("Disconnecting - ApiClient").ConfigureAwait(false); | |||
| //Disconnect from server | |||
| await ApiClient.DisconnectAsync().ConfigureAwait(false); | |||
| _scopes = null; | |||
| ConnectionState = ConnectionState.Disconnected; | |||
| await _rpcLogger.InfoAsync("Disconnected").ConfigureAwait(false); | |||
| @@ -272,7 +258,7 @@ namespace Discord | |||
| await _connectionLock.WaitAsync().ConfigureAwait(false); | |||
| try | |||
| { | |||
| await ConnectInternalAsync(_scopes).ConfigureAwait(false); | |||
| await ConnectInternalAsync().ConfigureAwait(false); | |||
| } | |||
| finally { _connectionLock.Release(); } | |||
| return; | |||
| @@ -295,6 +281,14 @@ namespace Discord | |||
| } | |||
| } | |||
| public async Task<string> AuthorizeAsync(string[] scopes) | |||
| { | |||
| await ConnectAsync().ConfigureAwait(false); | |||
| var result = await ApiClient.SendAuthorizeAsync(scopes).ConfigureAwait(false); | |||
| await DisconnectAsync().ConfigureAwait(false); | |||
| return result.Code; | |||
| } | |||
| private async Task ProcessMessageAsync(string cmd, Optional<string> evnt, Optional<object> payload) | |||
| { | |||
| try | |||
| @@ -313,21 +307,23 @@ namespace Discord | |||
| var _ = Task.Run(async () => | |||
| { | |||
| RequestOptions options = new RequestOptions | |||
| try | |||
| { | |||
| //CancellationToken = cancelToken //TODO: Implement | |||
| }; | |||
| if (_scopes != null) //No bearer | |||
| RequestOptions options = new RequestOptions | |||
| { | |||
| //CancellationToken = cancelToken //TODO: Implement | |||
| }; | |||
| await ApiClient.SendAuthenticateAsync(options).ConfigureAwait(false); //Has bearer | |||
| var __ = _connectTask.TrySetResultAsync(true); //Signal the .Connect() call to complete | |||
| await _rpcLogger.InfoAsync("Ready").ConfigureAwait(false); | |||
| } | |||
| catch (Exception ex) | |||
| { | |||
| var authorizeData = await ApiClient.SendAuthorizeAsync(_scopes, options).ConfigureAwait(false); | |||
| await ApiClient.LoginAsync(TokenType.Bearer, authorizeData.Code, options).ConfigureAwait(false); | |||
| await _rpcLogger.ErrorAsync($"Error handling {cmd}{(evnt.IsSpecified ? $" ({evnt})" : "")}", ex).ConfigureAwait(false); | |||
| return; | |||
| } | |||
| var authenticateData = await ApiClient.SendAuthenticateAsync(options).ConfigureAwait(false); //Has bearer | |||
| var __ = _connectTask.TrySetResultAsync(true); //Signal the .Connect() call to complete | |||
| await _rpcLogger.InfoAsync("Ready").ConfigureAwait(false); | |||
| }); | |||
| } | |||
| break; | |||