From 3a074c4c04ebd9afdbc40cefe0d42d0e5ffc1a3d Mon Sep 17 00:00:00 2001 From: RogueException Date: Sun, 27 Dec 2015 16:20:40 -0400 Subject: [PATCH] Fixed DiscordClient.Disconnect --- src/Discord.Net/DiscordClient.cs | 80 +++++++++++---------- src/Discord.Net/Net/Rest/SharpRestEngine.cs | 16 ++--- 2 files changed, 50 insertions(+), 46 deletions(-) diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index 56dc9d9e5..d8b117e9a 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -24,7 +24,7 @@ namespace Discord private readonly Semaphore _connectionLock; private readonly ManualResetEvent _disconnectedEvent; private readonly ManualResetEventSlim _connectedEvent; - private readonly TaskManager _taskManager; + private readonly TaskManager _taskManager; private readonly ConcurrentDictionary _servers; private readonly ConcurrentDictionary _channels; private readonly ConcurrentDictionary _privateChannels; //Key = RecipientId @@ -72,16 +72,16 @@ namespace Discord public IEnumerable PrivateChannels => _privateChannels.Select(x => x.Value); /// Gets a collection of all voice regions currently offered by Discord. public IEnumerable Regions => _regions.Select(x => x.Value); - - /// Initializes a new instance of the DiscordClient class. - public DiscordClient(DiscordConfig config = null) - { - Config = config ?? new DiscordConfig(); + + /// Initializes a new instance of the DiscordClient class. + public DiscordClient(DiscordConfig config = null) + { + Config = config ?? new DiscordConfig(); Config.Lock(); - - State = (int)ConnectionState.Disconnected; - Status = UserStatus.Online; - + + State = (int)ConnectionState.Disconnected; + Status = UserStatus.Online; + //Logging Log = new LogManager(this); Logger = Log.CreateLogger("Discord"); @@ -89,8 +89,8 @@ namespace Discord //Async _taskManager = new TaskManager(Cleanup); _connectionLock = new Semaphore(1, 1); - _disconnectedEvent = new ManualResetEvent(true); - _connectedEvent = new ManualResetEventSlim(false); + _disconnectedEvent = new ManualResetEvent(true); + _connectedEvent = new ManualResetEventSlim(false); CancelToken = new CancellationToken(true); //Cache @@ -102,8 +102,8 @@ namespace Discord _serializer = new JsonSerializer(); _serializer.DateTimeZoneHandling = DateTimeZoneHandling.Utc; #if TEST_RESPONSES - _serializer.CheckAdditionalContent = true; - _serializer.MissingMemberHandling = MissingMemberHandling.Error; + _serializer.CheckAdditionalContent = true; + _serializer.MissingMemberHandling = MissingMemberHandling.Error; #else _serializer.Error += (s, e) => { @@ -123,14 +123,14 @@ namespace Discord }; GatewaySocket.Disconnected += (s, e) => OnDisconnected(e.WasUnexpected, e.Exception); GatewaySocket.ReceivedDispatch += (s, e) => OnReceivedEvent(e); - - if (Config.UseMessageQueue) - MessageQueue = new MessageQueue(this); - Connected += async (s, e) => - { + + if (Config.UseMessageQueue) + MessageQueue = new MessageQueue(this); + Connected += async (s, e) => + { ClientAPI.CancelToken = CancelToken; - await SendStatus().ConfigureAwait(false); - }; + await SendStatus().ConfigureAwait(false); + }; //Extensibility Services = new ServiceManager(this); @@ -140,18 +140,18 @@ namespace Discord //_messageImporter.ContractResolver = new Message.ImportResolver(); } - /// Connects to the Discord server with the provided email and password. - /// Returns a token that can be optionally stored for future connections. - public async Task Connect(string email, string password) - { + /// Connects to the Discord server with the provided email and password. + /// Returns a token that can be optionally stored for future connections. + public async Task Connect(string email, string password) + { if (email == null) throw new ArgumentNullException(email); if (password == null) throw new ArgumentNullException(password); await BeginConnect(email, password, null).ConfigureAwait(false); return ClientAPI.Token; } - /// Connects to the Discord server with the provided token. - public async Task Connect(string token) + /// Connects to the Discord server with the provided token. + public async Task Connect(string token) { if (token == null) throw new ArgumentNullException(token); @@ -171,8 +171,8 @@ namespace Discord _taskManager.ClearException(); State = ConnectionState.Connecting; _disconnectedEvent.Reset(); - - await Login(email, password, token).ConfigureAwait(false); + + await Login(email, password, token).ConfigureAwait(false); await GatewaySocket.Connect().ConfigureAwait(false); List tasks = new List(); @@ -258,22 +258,25 @@ namespace Discord } } private void EndConnect() - { - State = ConnectionState.Connected; - _connectedEvent.Set(); - OnConnected(); - } + { + State = ConnectionState.Connected; + _connectedEvent.Set(); + OnConnected(); + } /// Disconnects from the Discord server, canceling any pending requests. - public Task Disconnect() => _taskManager.Stop(true); - private async Task Cleanup() + public async Task Disconnect() + { + if (State == ConnectionState.Connected) + await ClientAPI.Send(new LogoutRequest()).ConfigureAwait(false); + await _taskManager.Stop(true).ConfigureAwait(false); + } + private Task Cleanup() { State = ConnectionState.Disconnecting; if (Config.UseMessageQueue) MessageQueue.Clear(); - await ClientAPI.Send(new LogoutRequest()).ConfigureAwait(false); - ClientAPI.Token = null; GatewaySocket.Token = null; @@ -287,6 +290,7 @@ namespace Discord State = (int)ConnectionState.Disconnected; _connectedEvent.Reset(); _disconnectedEvent.Set(); + return TaskHelper.CompletedTask; } public Task SetStatus(UserStatus status) diff --git a/src/Discord.Net/Net/Rest/SharpRestEngine.cs b/src/Discord.Net/Net/Rest/SharpRestEngine.cs index 497d70af1..4a1003a30 100644 --- a/src/Discord.Net/Net/Rest/SharpRestEngine.cs +++ b/src/Discord.Net/Net/Rest/SharpRestEngine.cs @@ -64,10 +64,10 @@ namespace Discord.Net.Rest private async Task Send(RestRequest request, CancellationToken cancelToken) { int retryCount = 0; - while (true) - { - var response = await _client.ExecuteTaskAsync(request, cancelToken).ConfigureAwait(false); - int statusCode = (int)response.StatusCode; + while (true) + { + var response = await _client.ExecuteTaskAsync(request, cancelToken).ConfigureAwait(false); + int statusCode = (int)response.StatusCode; if (statusCode == 0) //Internal Error { //The request was aborted: Could not create SSL/TLS secure channel. @@ -99,11 +99,11 @@ namespace Discord.Net.Rest } throw new HttpException(response.StatusCode); } - else if (statusCode < 200 || statusCode >= 300) //2xx = Success - throw new HttpException(response.StatusCode); + else if (statusCode < 200 || statusCode >= 300) //2xx = Success + throw new HttpException(response.StatusCode); else - return response.Content; - } + return response.Content; + } } private Method GetMethod(string method)