diff --git a/src/Discord.Net/Net/Queue/RestRequest.cs b/src/Discord.Net/Net/Queue/RestRequest.cs index 49c557dfd..179ce6423 100644 --- a/src/Discord.Net/Net/Queue/RestRequest.cs +++ b/src/Discord.Net/Net/Queue/RestRequest.cs @@ -46,8 +46,10 @@ namespace Discord.Net.Queue { if (IsMultipart) return await Client.Send(Method, Endpoint, MultipartParams, HeaderOnly).ConfigureAwait(false); - else + else if (Json != null) return await Client.Send(Method, Endpoint, Json, HeaderOnly).ConfigureAwait(false); + else + return await Client.Send(Method, Endpoint, HeaderOnly).ConfigureAwait(false); } } } diff --git a/src/Discord.Net/Net/Rest/DefaultRestClient.cs b/src/Discord.Net/Net/Rest/DefaultRestClient.cs index 8166f23a7..9d83e9a32 100644 --- a/src/Discord.Net/Net/Rest/DefaultRestClient.cs +++ b/src/Discord.Net/Net/Rest/DefaultRestClient.cs @@ -32,8 +32,10 @@ namespace Discord.Net.Rest UseProxy = false, PreAuthenticate = false }); - SetHeader("accept-encoding", "gzip, deflate"); + + _cancelTokenSource = new CancellationTokenSource(); + _cancelToken = CancellationToken.None; _parentToken = CancellationToken.None; } protected virtual void Dispose(bool disposing) diff --git a/src/Discord.Net/Net/WebSockets/DefaultWebsocketClient.cs b/src/Discord.Net/Net/WebSockets/DefaultWebsocketClient.cs index 8eee70c0c..e9ae38f55 100644 --- a/src/Discord.Net/Net/WebSockets/DefaultWebsocketClient.cs +++ b/src/Discord.Net/Net/WebSockets/DefaultWebsocketClient.cs @@ -28,6 +28,9 @@ namespace Discord.Net.WebSockets _client = new ClientWebSocket(); _client.Options.Proxy = null; _client.Options.KeepAliveInterval = TimeSpan.Zero; + + _cancelTokenSource = new CancellationTokenSource(); + _cancelToken = CancellationToken.None; _parentToken = CancellationToken.None; } private void Dispose(bool disposing) @@ -46,6 +49,7 @@ namespace Discord.Net.WebSockets public async Task Connect(string host) { + //Assume locked await Disconnect().ConfigureAwait(false); _cancelTokenSource = new CancellationTokenSource(); @@ -56,9 +60,11 @@ namespace Discord.Net.WebSockets } public async Task Disconnect() { + //Assume locked _cancelTokenSource.Cancel(); - _client.Abort(); + if (_client.State == WebSocketState.Open) + try { await _client?.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None); } catch { } await (_task ?? Task.CompletedTask).ConfigureAwait(false); } @@ -75,6 +81,7 @@ namespace Discord.Net.WebSockets public async Task Send(byte[] data, int offset, int count, bool isText) { + //TODO: If connection is temporarily down, retry? int frameCount = (int)Math.Ceiling((double)count / SendChunkSize); for (int i = 0; i < frameCount; i++, offset += SendChunkSize) diff --git a/src/Discord.Net/WebSocket/DiscordClient.cs b/src/Discord.Net/WebSocket/DiscordClient.cs index 71b327a74..2639c9389 100644 --- a/src/Discord.Net/WebSocket/DiscordClient.cs +++ b/src/Discord.Net/WebSocket/DiscordClient.cs @@ -279,7 +279,7 @@ namespace Discord.WebSocket return models.Select(x => new Connection(x)); } - public async Task GetChannel(ulong id) + public Channel GetChannel(ulong id) { return DataStore.GetChannel(id); } @@ -292,7 +292,7 @@ namespace Discord.WebSocket return null; } - public async Task GetGuild(ulong id) + public Guild GetGuild(ulong id) { return DataStore.GetGuild(id); } @@ -303,11 +303,11 @@ namespace Discord.WebSocket return new Guild(this, model); } - public async Task GetUser(ulong id) + public User GetUser(ulong id) { return DataStore.GetUser(id); } - public async Task GetUser(string username, ushort discriminator) + public User GetUser(string username, ushort discriminator) { return DataStore.Users.Where(x => x.Discriminator == discriminator && x.Username == username).FirstOrDefault(); } @@ -317,7 +317,7 @@ namespace Discord.WebSocket return models.Select(x => new User(this, x)); } - public async Task GetVoiceRegion(string id) + public VoiceRegion GetVoiceRegion(string id) { VoiceRegion region; if (_voiceRegions.TryGetValue(id, out region)) @@ -335,7 +335,6 @@ namespace Discord.WebSocket //Global case "READY": { - //TODO: None of this is really threadsafe - should only replace the cache collections when they have been fully populated //TODO: Store guilds even if they're unavailable //TODO: Make downloading large guilds optional @@ -866,31 +865,31 @@ namespace Discord.WebSocket } } - async Task IDiscordClient.GetChannel(ulong id) - => await GetChannel(id).ConfigureAwait(false); + Task IDiscordClient.GetChannel(ulong id) + => Task.FromResult(GetChannel(id)); Task> IDiscordClient.GetDMChannels() => Task.FromResult>(DMChannels.ToImmutableArray()); async Task> IDiscordClient.GetConnections() => await GetConnections().ConfigureAwait(false); async Task IDiscordClient.GetInvite(string inviteIdOrXkcd) => await GetInvite(inviteIdOrXkcd).ConfigureAwait(false); - async Task IDiscordClient.GetGuild(ulong id) - => await GetGuild(id).ConfigureAwait(false); + Task IDiscordClient.GetGuild(ulong id) + => Task.FromResult(GetGuild(id)); Task> IDiscordClient.GetGuilds() => Task.FromResult>(Guilds.ToImmutableArray()); async Task IDiscordClient.CreateGuild(string name, IVoiceRegion region, Stream jpegIcon) => await CreateGuild(name, region, jpegIcon).ConfigureAwait(false); - async Task IDiscordClient.GetUser(ulong id) - => await GetUser(id).ConfigureAwait(false); - async Task IDiscordClient.GetUser(string username, ushort discriminator) - => await GetUser(username, discriminator).ConfigureAwait(false); + Task IDiscordClient.GetUser(ulong id) + => Task.FromResult(GetUser(id)); + Task IDiscordClient.GetUser(string username, ushort discriminator) + => Task.FromResult(GetUser(username, discriminator)); Task IDiscordClient.GetCurrentUser() => Task.FromResult(CurrentUser); async Task> IDiscordClient.QueryUsers(string query, int limit) => await QueryUsers(query, limit).ConfigureAwait(false); Task> IDiscordClient.GetVoiceRegions() => Task.FromResult>(VoiceRegions.ToImmutableArray()); - async Task IDiscordClient.GetVoiceRegion(string id) - => await GetVoiceRegion(id).ConfigureAwait(false); + Task IDiscordClient.GetVoiceRegion(string id) + => Task.FromResult(GetVoiceRegion(id)); } } diff --git a/src/Discord.Net/WebSocket/Entities/Guilds/Guild.cs b/src/Discord.Net/WebSocket/Entities/Guilds/Guild.cs index 1b0f87f2a..19657d9bb 100644 --- a/src/Discord.Net/WebSocket/Entities/Guilds/Guild.cs +++ b/src/Discord.Net/WebSocket/Entities/Guilds/Guild.cs @@ -88,7 +88,7 @@ namespace Discord.WebSocket Update(model); } - private void Update(Model model) + private async void Update(Model model) { _afkChannelId = model.AFKChannelId; AFKTimeout = model.AFKTimeout;