Browse Source

Implemented resume_gateway_url.

pull/2423/head
Quahu 2 years ago
parent
commit
8e2dc238c3
3 changed files with 50 additions and 6 deletions
  1. +2
    -0
      src/Discord.Net.WebSocket/API/Gateway/ReadyEvent.cs
  2. +42
    -5
      src/Discord.Net.WebSocket/DiscordSocketApiClient.cs
  3. +6
    -1
      src/Discord.Net.WebSocket/DiscordSocketClient.cs

+ 2
- 0
src/Discord.Net.WebSocket/API/Gateway/ReadyEvent.cs View File

@@ -20,6 +20,8 @@ namespace Discord.API.Gateway
public User User { get; set; } public User User { get; set; }
[JsonProperty("session_id")] [JsonProperty("session_id")]
public string SessionId { get; set; } public string SessionId { get; set; }
[JsonProperty("resume_gateway_url")]
public string ResumeGatewayUrl { get; set; }
[JsonProperty("read_state")] [JsonProperty("read_state")]
public ReadState[] ReadStates { get; set; } public ReadState[] ReadStates { get; set; }
[JsonProperty("guilds")] [JsonProperty("guilds")]


+ 42
- 5
src/Discord.Net.WebSocket/DiscordSocketApiClient.cs View File

@@ -28,6 +28,7 @@ namespace Discord.API
private readonly bool _isExplicitUrl; private readonly bool _isExplicitUrl;
private CancellationTokenSource _connectCancelToken; private CancellationTokenSource _connectCancelToken;
private string _gatewayUrl; private string _gatewayUrl;
private string _resumeGatewayUrl;


//Store our decompression streams for zlib shared state //Store our decompression streams for zlib shared state
private MemoryStream _compressed; private MemoryStream _compressed;
@@ -37,6 +38,14 @@ namespace Discord.API


public ConnectionState ConnectionState { get; private set; } public ConnectionState ConnectionState { get; private set; }


/// <summary>
/// Sets the gateway URL used for resumes.
/// </summary>
public string ResumeGatewayUrl
{
set => _resumeGatewayUrl = FormatGatewayUrl(value);
}

public DiscordSocketApiClient(RestClientProvider restClientProvider, WebSocketProvider webSocketProvider, string userAgent, public DiscordSocketApiClient(RestClientProvider restClientProvider, WebSocketProvider webSocketProvider, string userAgent,
string url = null, RetryMode defaultRetryMode = RetryMode.AlwaysRetry, JsonSerializer serializer = null, string url = null, RetryMode defaultRetryMode = RetryMode.AlwaysRetry, JsonSerializer serializer = null,
bool useSystemClock = true, Func<IRateLimitInfo, Task> defaultRatelimitCallback = null) bool useSystemClock = true, Func<IRateLimitInfo, Task> defaultRatelimitCallback = null)
@@ -157,6 +166,17 @@ namespace Discord.API
#endif #endif
} }


/// <summary>
/// Appends necessary query parameters to the specified gateway URL.
/// </summary>
private static string FormatGatewayUrl(string gatewayUrl)
{
if (gatewayUrl == null)
return null;

return $"{gatewayUrl}?v={DiscordConfig.APIVersion}&encoding={DiscordSocketConfig.GatewayEncoding}&compress=zlib-stream";
}

public async Task ConnectAsync() public async Task ConnectAsync()
{ {
await _stateLock.WaitAsync().ConfigureAwait(false); await _stateLock.WaitAsync().ConfigureAwait(false);
@@ -191,24 +211,41 @@ namespace Discord.API
if (WebSocketClient != null) if (WebSocketClient != null)
WebSocketClient.SetCancelToken(_connectCancelToken.Token); WebSocketClient.SetCancelToken(_connectCancelToken.Token);


if (!_isExplicitUrl)
string gatewayUrl;
if (_resumeGatewayUrl == null)
{
if (!_isExplicitUrl)
{
// TODO: 'GetGatewayAsync' -> 'GetBotGatewayAsync', but it could just be hardcoded to 'wss://gateway.discord.gg/'
var gatewayResponse = await GetGatewayAsync().ConfigureAwait(false);
gatewayUrl = _gatewayUrl = FormatGatewayUrl(gatewayResponse.Url);
}
else
{
gatewayUrl = _gatewayUrl;
}
}
else
{ {
var gatewayResponse = await GetGatewayAsync().ConfigureAwait(false);
_gatewayUrl = $"{gatewayResponse.Url}?v={DiscordConfig.APIVersion}&encoding={DiscordSocketConfig.GatewayEncoding}&compress=zlib-stream";
gatewayUrl = _resumeGatewayUrl;
} }


#if DEBUG_PACKETS #if DEBUG_PACKETS
Console.WriteLine("Connecting to gateway: " + _gatewayUrl);
Console.WriteLine("Connecting to gateway: " + gatewayUrl);
#endif #endif


await WebSocketClient.ConnectAsync(_gatewayUrl).ConfigureAwait(false);
await WebSocketClient.ConnectAsync(gatewayUrl).ConfigureAwait(false);


ConnectionState = ConnectionState.Connected; ConnectionState = ConnectionState.Connected;
} }
catch catch
{ {
if (!_isExplicitUrl) if (!_isExplicitUrl)
{
// TODO: '_gatewayUrl = null' doesn't do anything, it's never null checked
_gatewayUrl = null; //Uncache in case the gateway url changed _gatewayUrl = null; //Uncache in case the gateway url changed
}

await DisconnectInternalAsync().ConfigureAwait(false); await DisconnectInternalAsync().ConfigureAwait(false);
throw; throw;
} }


+ 6
- 1
src/Discord.Net.WebSocket/DiscordSocketClient.cs View File

@@ -322,7 +322,6 @@ namespace Discord.WebSocket
} }
private async Task OnDisconnectingAsync(Exception ex) private async Task OnDisconnectingAsync(Exception ex)
{ {

await _gatewayLogger.DebugAsync("Disconnecting ApiClient").ConfigureAwait(false); await _gatewayLogger.DebugAsync("Disconnecting ApiClient").ConfigureAwait(false);
await ApiClient.DisconnectAsync(ex).ConfigureAwait(false); await ApiClient.DisconnectAsync(ex).ConfigureAwait(false);


@@ -353,6 +352,10 @@ namespace Discord.WebSocket
if (guild.IsAvailable) if (guild.IsAvailable)
await GuildUnavailableAsync(guild).ConfigureAwait(false); await GuildUnavailableAsync(guild).ConfigureAwait(false);
} }

_sessionId = null;
_lastSeq = 0;
ApiClient.ResumeGatewayUrl = null;
} }


/// <inheritdoc /> /// <inheritdoc />
@@ -832,6 +835,7 @@ namespace Discord.WebSocket


_sessionId = null; _sessionId = null;
_lastSeq = 0; _lastSeq = 0;
ApiClient.ResumeGatewayUrl = null;


if (_shardedClient != null) if (_shardedClient != null)
{ {
@@ -889,6 +893,7 @@ namespace Discord.WebSocket
AddPrivateChannel(data.PrivateChannels[i], state); AddPrivateChannel(data.PrivateChannels[i], state);


_sessionId = data.SessionId; _sessionId = data.SessionId;
ApiClient.ResumeGatewayUrl = data.ResumeGatewayUrl;
_unavailableGuildCount = unavailableGuilds; _unavailableGuildCount = unavailableGuilds;
CurrentUser = currentUser; CurrentUser = currentUser;
_previousSessionUser = CurrentUser; _previousSessionUser = CurrentUser;


Loading…
Cancel
Save