diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 2fe5abfe8..9aa0e5788 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -39,4 +39,3 @@ jobs:
steps:
- template: azure/build.yml
- template: azure/deploy.yml
- - template: azure/docs.yml
diff --git a/src/Discord.Net.Core/Entities/Messages/IMessage.cs b/src/Discord.Net.Core/Entities/Messages/IMessage.cs
index eb135768c..b5023eb59 100644
--- a/src/Discord.Net.Core/Entities/Messages/IMessage.cs
+++ b/src/Discord.Net.Core/Entities/Messages/IMessage.cs
@@ -10,7 +10,7 @@ namespace Discord
public interface IMessage : ISnowflakeEntity, IDeletable
{
///
- /// Gets the type of this system message.
+ /// Gets the type of this message.
///
MessageType Type { get; }
///
diff --git a/src/Discord.Net.Rest/DiscordRestClient.cs b/src/Discord.Net.Rest/DiscordRestClient.cs
index 9cdb8e409..b5bdc4235 100644
--- a/src/Discord.Net.Rest/DiscordRestClient.cs
+++ b/src/Discord.Net.Rest/DiscordRestClient.cs
@@ -16,7 +16,7 @@ namespace Discord.Rest
///
/// Gets the logged-in user.
///
- public new RestSelfUser CurrentUser => base.CurrentUser as RestSelfUser;
+ public new RestSelfUser CurrentUser { get => base.CurrentUser as RestSelfUser; internal set => base.CurrentUser = value; }
///
public DiscordRestClient() : this(new DiscordRestConfig()) { }
diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs
index 793e89dff..0c54743a6 100644
--- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs
+++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs
@@ -71,6 +71,8 @@ namespace Discord.Rest
public MessageReference Reference { get; private set; }
///
public MessageFlags? Flags { get; private set; }
+ ///
+ public MessageType Type { get; private set; }
internal RestMessage(BaseDiscordClient discord, ulong id, IMessageChannel channel, IUser author, MessageSource source)
: base(discord, id)
@@ -88,6 +90,8 @@ namespace Discord.Rest
}
internal virtual void Update(Model model)
{
+ Type = model.Type;
+
if (model.Timestamp.IsSpecified)
_timestampTicks = model.Timestamp.Value.UtcTicks;
@@ -166,8 +170,6 @@ namespace Discord.Rest
///
public override string ToString() => Content;
- ///
- MessageType IMessage.Type => MessageType.Default;
IUser IMessage.Author => Author;
///
IReadOnlyCollection IMessage.Attachments => Attachments;
diff --git a/src/Discord.Net.Rest/Entities/Messages/RestSystemMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestSystemMessage.cs
index 89a651eb7..1c59d4f45 100644
--- a/src/Discord.Net.Rest/Entities/Messages/RestSystemMessage.cs
+++ b/src/Discord.Net.Rest/Entities/Messages/RestSystemMessage.cs
@@ -9,9 +9,6 @@ namespace Discord.Rest
[DebuggerDisplay(@"{DebuggerDisplay,nq}")]
public class RestSystemMessage : RestMessage, ISystemMessage
{
- ///
- public MessageType Type { get; private set; }
-
internal RestSystemMessage(BaseDiscordClient discord, ulong id, IMessageChannel channel, IUser author)
: base(discord, id, channel, author, MessageSource.System)
{
@@ -25,8 +22,6 @@ namespace Discord.Rest
internal override void Update(Model model)
{
base.Update(model);
-
- Type = model.Type;
}
private string DebuggerDisplay => $"{Author}: {Content} ({Id}, {Type})";
diff --git a/src/Discord.Net.WebSocket/ConnectionManager.cs b/src/Discord.Net.WebSocket/ConnectionManager.cs
index 2237e2d1f..e444f359f 100644
--- a/src/Discord.Net.WebSocket/ConnectionManager.cs
+++ b/src/Discord.Net.WebSocket/ConnectionManager.cs
@@ -75,11 +75,6 @@ namespace Discord
nextReconnectDelay = 1000; //Reset delay
await _connectionPromise.Task.ConfigureAwait(false);
}
- catch (OperationCanceledException ex)
- {
- Cancel(); //In case this exception didn't come from another Error call
- await DisconnectAsync(ex, !reconnectCancelToken.IsCancellationRequested).ConfigureAwait(false);
- }
catch (Exception ex)
{
Error(ex); //In case this exception didn't come from another Error call
@@ -143,16 +138,7 @@ namespace Discord
catch (OperationCanceledException) { }
});
- try
- {
- await _onConnecting().ConfigureAwait(false);
- }
- catch (TaskCanceledException ex)
- {
- Exception innerEx = ex.InnerException ?? new OperationCanceledException("Failed to connect.");
- Error(innerEx);
- throw innerEx;
- }
+ await _onConnecting().ConfigureAwait(false);
await _logger.InfoAsync("Connected").ConfigureAwait(false);
State = ConnectionState.Connected;
diff --git a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs
index d1407da01..65fd23d3f 100644
--- a/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs
+++ b/src/Discord.Net.WebSocket/DiscordSocketApiClient.cs
@@ -188,9 +188,9 @@ namespace Discord.API
catch { }
if (ex is GatewayReconnectException)
- await WebSocketClient.DisconnectAsync(4000);
+ await WebSocketClient.DisconnectAsync(4000).ConfigureAwait(false);
else
- await WebSocketClient.DisconnectAsync().ConfigureAwait(false);
+ await WebSocketClient.DisconnectAsync().ConfigureAwait(false);
ConnectionState = ConnectionState.Disconnected;
}
diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs
index 888055da9..2cdff662c 100644
--- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs
+++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs
@@ -618,6 +618,7 @@ namespace Discord.WebSocket
var activities = _activity.IsSpecified ? ImmutableList.Create(_activity.Value) : null;
currentUser.Presence = new SocketPresence(Status, null, activities);
ApiClient.CurrentUserId = currentUser.Id;
+ Rest.CurrentUser = RestSelfUser.Create(this, data.User);
int unavailableGuilds = 0;
for (int i = 0; i < data.Guilds.Length; i++)
{
diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs
index 8b45d882b..353c26fb8 100644
--- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs
+++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs
@@ -61,6 +61,9 @@ namespace Discord.WebSocket
///
public MessageFlags? Flags { get; private set; }
+ ///
+ public MessageType Type { get; private set; }
+
///
/// Returns all attachments included in this message.
///
@@ -122,6 +125,8 @@ namespace Discord.WebSocket
}
internal virtual void Update(ClientState state, Model model)
{
+ Type = model.Type;
+
if (model.Timestamp.IsSpecified)
_timestampTicks = model.Timestamp.Value.UtcTicks;
@@ -185,8 +190,6 @@ namespace Discord.WebSocket
///
IMessageChannel IMessage.Channel => Channel;
///
- MessageType IMessage.Type => MessageType.Default;
- ///
IReadOnlyCollection IMessage.Attachments => Attachments;
///
IReadOnlyCollection IMessage.Embeds => Embeds;
diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketSystemMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketSystemMessage.cs
index d0ce5025b..ec22a7703 100644
--- a/src/Discord.Net.WebSocket/Entities/Messages/SocketSystemMessage.cs
+++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketSystemMessage.cs
@@ -9,9 +9,6 @@ namespace Discord.WebSocket
[DebuggerDisplay(@"{DebuggerDisplay,nq}")]
public class SocketSystemMessage : SocketMessage, ISystemMessage
{
- ///
- public MessageType Type { get; private set; }
-
internal SocketSystemMessage(DiscordSocketClient discord, ulong id, ISocketMessageChannel channel, SocketUser author)
: base(discord, id, channel, author, MessageSource.System)
{
@@ -25,8 +22,6 @@ namespace Discord.WebSocket
internal override void Update(ClientState state, Model model)
{
base.Update(state, model);
-
- Type = model.Type;
}
private string DebuggerDisplay => $"{Author}: {Content} ({Id}, {Type})";
diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs
index 9263fe642..444c76ffa 100644
--- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs
+++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs
@@ -125,12 +125,16 @@ namespace Discord.WebSocket
{
var entity = new SocketGuildUser(guild, guild.Discord.GetOrCreateUser(state, model.User));
entity.Update(state, model);
+ if (!model.Roles.IsSpecified)
+ entity.UpdateRoles(new ulong[0]);
return entity;
}
internal static SocketGuildUser Create(SocketGuild guild, ClientState state, PresenceModel model)
{
var entity = new SocketGuildUser(guild, guild.Discord.GetOrCreateUser(state, model.User));
entity.Update(state, model, false);
+ if (!model.Roles.IsSpecified)
+ entity.UpdateRoles(new ulong[0]);
return entity;
}
internal void Update(ClientState state, MemberModel model)
diff --git a/src/Discord.Net.WebSocket/Net/DefaultWebSocketClient.cs b/src/Discord.Net.WebSocket/Net/DefaultWebSocketClient.cs
index 4723ae57a..82e2f0573 100644
--- a/src/Discord.Net.WebSocket/Net/DefaultWebSocketClient.cs
+++ b/src/Discord.Net.WebSocket/Net/DefaultWebSocketClient.cs
@@ -108,11 +108,11 @@ namespace Discord.Net.WebSockets
}
private async Task DisconnectInternalAsync(int closeCode = 1000, bool isDisposing = false)
{
+ _isDisconnecting = true;
+
try { _disconnectTokenSource.Cancel(false); }
catch { }
- _isDisconnecting = true;
-
if (_client != null)
{
if (!isDisposing)
@@ -166,7 +166,14 @@ namespace Discord.Net.WebSockets
public async Task SendAsync(byte[] data, int index, int count, bool isText)
{
- await _lock.WaitAsync().ConfigureAwait(false);
+ try
+ {
+ await _lock.WaitAsync(_cancelToken).ConfigureAwait(false);
+ }
+ catch (TaskCanceledException)
+ {
+ return;
+ }
try
{
if (_client == null) return;
@@ -201,7 +208,7 @@ namespace Discord.Net.WebSockets
{
while (!cancelToken.IsCancellationRequested)
{
- WebSocketReceiveResult socketResult = await _client.ReceiveAsync(buffer, CancellationToken.None).ConfigureAwait(false);
+ WebSocketReceiveResult socketResult = await _client.ReceiveAsync(buffer, cancelToken).ConfigureAwait(false);
byte[] result;
int resultCount;