/// <summary> /// Connects this Shard to the Discord Gateway. /// </summary> /// <returns>Task</returns> public async Task ConnectAsync() { if (!Gateway.Ready) { await Gateway.InitializeAsync(); } LastHeartbeatAcked = true; if (WebSocketClient != null) { _log(LogLevel.DEBUG, "Disposing old WebSocketClient..."); WebSocketClient.Open -= _onOpen; WebSocketClient.Message -= _onMessage; WebSocketClient.Close -= _onClose; WebSocketClient.Error -= _onError; WebSocketClient.Dispose(); _stopHeartbeatTimer(); } WebSocketClient = new WebSocketClient(Gateway.Url); WebSocketClient.Open += _onOpen; WebSocketClient.Message += _onMessage; WebSocketClient.Close += _onClose; WebSocketClient.Error += _onError; _log(LogLevel.DEBUG, "Connecting to Websocket..."); try { await WebSocketClient.ConnectAsync(); ReconnectDelay = 0; } catch (Exception e) { if (ReconnectDelay == 0) { ReconnectDelay = 1000; } else { ReconnectDelay *= 2; } _log(LogLevel.ERROR, $"Websocket connection errored with {e.Message}, retrying in {TimeSpan.FromMilliseconds(ReconnectDelay).TotalSeconds} seconds..."); await Task.Delay(ReconnectDelay); await ConnectAsync(); return; } await _waitForIdentify(); }
/// <summary> /// Connects this Shard to the Discord Gateway. /// </summary> /// <returns>Task</returns> public async Task ConnectAsync() { if (!Gateway.Ready) { await Gateway.InitializeAsync(); } LastHeartbeatAcked = true; if (WebSocketClient != null) { _log(LogLevel.DEBUG, "Disposing old WebSocketClient..."); WebSocketClient.Open -= _onOpen; WebSocketClient.Message -= _onMessage; WebSocketClient.Close -= _onClose; WebSocketClient.Error -= _onError; WebSocketClient.Dispose(); _stopHeartbeatTimer(); } WebSocketClient = new WebSocketClient(Gateway.Url); WebSocketClient.Open += _onOpen; WebSocketClient.Message += _onMessage; WebSocketClient.Close += _onClose; WebSocketClient.Error += _onError; _log(LogLevel.DEBUG, "Connecting to Websocket..."); try { await WebSocketClient.ConnectAsync(); } catch (Exception) { int delay; switch (ReconnectStrategy) { case ReconnectStrategy.FIBONACCI: delay = Util.Fibonacci(ReconnectValue); ReconnectValue++; break; case ReconnectStrategy.EXPONENTIAL: delay = ReconnectValue; ReconnectValue *= 2; break; case ReconnectStrategy.PERIODICALLY: delay = ReconnectValue; break; default: throw new ArgumentOutOfRangeException(); } await Task.Delay(delay); await ConnectAsync(); return; } await _waitForIdentify(); }