Skip to content

Commit f5eba41

Browse files
committed
Fix exceptions thrown when calling Shard.StopAsync (#82)
- DiscordClientWebSocket no longer erroneously sends a close acknowledgment when receiving a remote close after starting a close itself locally - GatewaySocket no longer erroneously attempts to reconnect when receiving a remote close after starting a close itself locally
1 parent a8b273b commit f5eba41

3 files changed

Lines changed: 36 additions & 16 deletions

File tree

src/Discore/Discore.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
<PropertyGroup>
44
<TargetFramework>netstandard1.5</TargetFramework>
55
<Copyright>Ethan Lafrenais 2020</Copyright>
6-
<Version>4.4.0</Version>
7-
<AssemblyVersion>4.4.0.0</AssemblyVersion>
8-
<FileVersion>4.4.0.0</FileVersion>
6+
<Version>4.4.1</Version>
7+
<AssemblyVersion>4.4.1.0</AssemblyVersion>
8+
<FileVersion>4.4.1.0</FileVersion>
99
<Authors>Ethan Lafrenais;Tristan Smith</Authors>
1010
<PackageTags>discord;discord-api;discord-library;dotnet-standard</PackageTags>
1111
<Description>Discore is a light-weight .NET Standard library designed for creating Discord bots.
@@ -16,7 +16,7 @@ Please note: Discore is not an official Discord API library!</Description>
1616
<RepositoryUrl>https://github.com/Francessco121/Discore.git</RepositoryUrl>
1717
<RepositoryType>git</RepositoryType>
1818
<PackageProjectUrl>https://github.com/Francessco121/Discore</PackageProjectUrl>
19-
<PackageReleaseNotes>See https://github.com/Francessco121/Discore/releases/tag/v4.4.0</PackageReleaseNotes>
19+
<PackageReleaseNotes>See https://github.com/Francessco121/Discore/releases/tag/v4.4.1</PackageReleaseNotes>
2020
<PackageLicenseFile></PackageLicenseFile>
2121
<PackageLicenseExpression>MIT</PackageLicenseExpression>
2222
</PropertyGroup>

src/Discore/WebSocket/Internal/DiscordClientWebSocket.cs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -346,23 +346,32 @@ async Task ReceiveLoop()
346346
log.LogVerbose($"[ReceiveLoop] Received close: {result.CloseStatusDescription} " +
347347
$"{result.CloseStatus} ({(int)result.CloseStatus})");
348348

349-
try
349+
if (socket.State == WebSocketState.Open
350+
|| socket.State == WebSocketState.CloseReceived
351+
|| socket.State == WebSocketState.CloseSent)
350352
{
351-
log.LogVerbose("[ReceiveLoop] Completing close handshake with status NormalClosure (1000)...");
353+
try
354+
{
355+
log.LogVerbose("[ReceiveLoop] Completing close handshake with status NormalClosure (1000)...");
352356

353-
// Complete the closing handshake
354-
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", abortCancellationSource.Token)
355-
.ConfigureAwait(false);
357+
// Complete the closing handshake
358+
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "", abortCancellationSource.Token)
359+
.ConfigureAwait(false);
356360

357-
log.LogVerbose("[ReceiveLoop] Completed close handshake.");
358-
}
359-
catch (OperationCanceledException)
360-
{
361-
log.LogVerbose($"[ReceiveLoop] Socket aborted while closing.");
361+
log.LogVerbose("[ReceiveLoop] Completed close handshake.");
362+
}
363+
catch (OperationCanceledException)
364+
{
365+
log.LogVerbose($"[ReceiveLoop] Socket aborted while closing.");
366+
}
367+
catch (Exception ex)
368+
{
369+
log.LogError($"[ReceiveLoop] Failed to complete closing handshake: {ex}");
370+
}
362371
}
363-
catch (Exception ex)
372+
else
364373
{
365-
log.LogError($"[ReceiveLoop] Failed to complete closing handshake: {ex}");
374+
log.LogVerbose("[ReceiveLoop] Close handshake completed by remote end.");
366375
}
367376

368377
// Notify inheriting object

src/Discore/WebSocket/Internal/GatewaySocket.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ partial class GatewaySocket : DiscordClientWebSocket
4848
/// </summary>
4949
bool receivedHello;
5050

51+
/// <summary>
52+
/// Whether disconnection was initiated on our end.
53+
/// </summary>
54+
bool areWeDisconnecting;
55+
5156
bool isDisposed;
5257

5358
DiscoreLogger log;
@@ -70,6 +75,8 @@ public GatewaySocket(string loggingName, int sequence,
7075
public override async Task DisconnectAsync(WebSocketCloseStatus closeStatus, string statusDescription,
7176
CancellationToken cancellationToken)
7277
{
78+
areWeDisconnecting = true;
79+
7380
// Disconnect the socket
7481
await base.DisconnectAsync(closeStatus, statusDescription, cancellationToken)
7582
.ConfigureAwait(false);
@@ -97,6 +104,10 @@ protected override async Task OnPayloadReceived(DiscordApiData payload)
97104

98105
protected override void OnCloseReceived(WebSocketCloseStatus closeStatus, string closeDescription)
99106
{
107+
// If we initiated a disconnect, this is just the remote end's acknowledgment
108+
// and we should not start reconnecting
109+
if (areWeDisconnecting) return;
110+
100111
GatewayCloseCode code = (GatewayCloseCode)closeStatus;
101112
switch (code)
102113
{

0 commit comments

Comments
 (0)