示例#1
0
        /// <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();
        }
示例#2
0
        /// <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();
        }