public async Task Reconnect(CancellationToken Token)
        {
            Close();
            await Open(Token);

            OnReconnected?.Invoke(this, new OnReconnectedEventArgs());
        }
Example #2
0
        public async Task Reconnect()
        {
            Close();
            await Open();

            OnReconnected?.Invoke(this, new OnReconnectedEventArgs());
        }
Example #3
0
 public void Reconnect()
 {
     Close();
     if (Open())
     {
         OnReconnected?.Invoke(this, new OnReconnectedEventArgs());
     }
 }
Example #4
0
        public StreamFlowDriverSignalR(ISignalRService signalRService)
        {
            SignalRService = signalRService;

            SignalRService.Connection.Reconnected  += async(e) => OnReconnected?.Invoke();
            SignalRService.Connection.Reconnecting += async(e) => OnReconnecting?.Invoke();
            SignalRService.Connection.Closed       += async(e) => OnDisconnected?.Invoke();
        }
Example #5
0
        public async Task <bool> CreateAsync()
        {
            if (connecting || connected)
            {
                return(false);
            }

            connecting = true;
            try
            {
                var sessionToken     = tokenProvider.GetSessionToken();
                var token            = JsonConvert.SerializeObject(sessionToken);
                var sessionTokenData = token.Base64Encode();

                webSocket = new ClientWebSocket();
                webSocket.Options.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36");
                webSocket.Options.SetRequestHeader("session-token", sessionTokenData);
                await webSocket.ConnectAsync(new Uri(settings.WebSocketEndpoint), CancellationToken.None);

                connected = true;

                Interlocked.Increment(ref connectionCounter);

                logger.Debug("Connected to the server");

                if (readProcessThread == null)
                {
                    (readProcessThread = new Thread(ProcessRead)).Start();
                }

                if (sendProcessThread == null)
                {
                    (sendProcessThread = new Thread(ProcessSend)).Start();
                }

                if (reconnecting)
                {
                    reconnecting = false;
                    OnReconnected?.Invoke(this, EventArgs.Empty);
                }

                return(true);
            }
            catch (Exception exc)
            {
                logger.Error(exc.Message.ToString());
                connected = false;
            }
            finally
            {
                connecting = false;
            }
            return(false);
        }
 internal void HandleReconnected()
 {
     connection.ReOpenSession(ClientId).ContinueWith(t => {
         if (t.IsFaulted)
         {
             AVRealtime.PrintLog(t.Exception.InnerException.Message);
             return;
         }
         // IM Client 重连完成
         OnReconnected?.Invoke();
     });
 }
 public void Reconnect()
 {
     Task.Run(() =>
     {
         Task.Delay(20).Wait();
         Close();
         if (Open())
         {
             OnReconnected?.Invoke(this, new OnReconnectedEventArgs());
         }
     });
 }
Example #8
0
 private void ReConnecting()
 {
     while (true)
     {
         log("ReConnecting");
         try
         {
             InitConnection();
             OnReconnected?.Invoke();
             log("Reconnected");
             break;
         }
         catch
         {
         }
         Thread.Sleep(60000);
     }
 }
Example #9
0
        /// <exception cref="OperationCanceledException"></exception>
        async Task ConnectLoop(bool resume, CancellationToken cancellationToken)
        {
            // Keep track of whether this is a resume or new session so
            // we can respond to the HELLO payload appropriately.
            isConnectionResuming = resume;

            log.LogVerbose($"[ConnectLoop] resume = {resume}");

            handshakeCompleteEvent.Reset();
            handshakeCompleteCancellationSource = new CancellationTokenSource();

            while (!cancellationToken.IsCancellationRequested)
            {
                // Ensure previous socket has been closed
                if (socket != null)
                {
                    UnsubscribeSocketEvents();

                    if (resume)
                    {
                        // Store previous sequence
                        lastSequence = socket.Sequence;
                    }

                    if (socket.CanBeDisconnected)
                    {
                        log.LogVerbose("[ConnectLoop] Disconnecting previous socket...");

                        // If for some reason the socket cannot be disconnected gracefully,
                        // DisconnectAsync will abort the socket after 5s.

                        if (resume)
                        {
                            // Make sure to disconnect with a non 1000 code to ensure Discord doesn't
                            // force us to make a new session since we are resuming.
                            await socket.DisconnectAsync(WebSocketCloseStatus.EndpointUnavailable,
                                                         "Reconnecting to resume...", cancellationToken).ConfigureAwait(false);
                        }
                        else
                        {
                            await socket.DisconnectAsync(WebSocketCloseStatus.NormalClosure,
                                                         "Starting new session...", cancellationToken).ConfigureAwait(false);
                        }
                    }

                    socket.Dispose();
                }

                if (!resume)
                {
                    // If not resuming, reset gateway session state.
                    lastSequence = 0;
                }

                // Create a new socket
                socket = new GatewaySocket($"GatewaySocket#{shard.Id}", lastSequence,
                                           outboundPayloadRateLimiter, gameStatusUpdateRateLimiter, identifyRateLimiter);

                socket.OnHello = async() =>
                {
                    if (isDisposed)
                    {
                        return;
                    }

                    if (isConnectionResuming)
                    {
                        // Resume
                        await socket.SendResumePayload(botToken, sessionId, lastSequence);
                    }
                    else
                    {
                        // Identify
                        await socket.SendIdentifyPayload(botToken, lastShardStartConfig.GatewayLargeThreshold,
                                                         shard.Id, totalShards);
                    }
                };

                SubscribeSocketEvents();

                // Get the gateway URL if we don't have one
                string gatewayUrl = GatewayUrlMemoryCache.GatewayUrl;

                if (gatewayUrl == null)
                {
                    try
                    {
                        log.LogVerbose("[ConnectLoop] Retrieving Gateway URL...");

                        gatewayUrl = await http.GetGateway().ConfigureAwait(false);

                        GatewayUrlMemoryCache.UpdateUrl(gatewayUrl);
                    }
                    catch (Exception ex) when(ex is DiscordHttpApiException || ex is HttpRequestException || ex is OperationCanceledException)
                    {
                        log.LogError($"[ConnectLoop:GetGateway] {ex}");
                        log.LogError("[ConnectLoop] No gateway URL to connect with, trying again in 10s...");

                        await Task.Delay(10 * 1000, cancellationToken).ConfigureAwait(false);

                        continue;
                    }
                    catch (Exception ex)
                    {
                        // This should never-ever happen, but we need to handle it just in-case.

                        log.LogError(ex);
                        log.LogError("[ConnectLoop] Uncaught severe error occured while getting the Gateway URL, setting state to Disconnected.");

                        state = GatewayState.Disconnected;

                        gatewayFailureData = new GatewayFailureData(
                            "Failed to retrieve the Gateway URL because of an unknown error.",
                            ShardFailureReason.Unknown, ex);

                        handshakeCompleteEvent.Set();

                        OnFailure?.Invoke(this, gatewayFailureData);

                        break;
                    }
                }

                log.LogVerbose($"[ConnectLoop] gatewayUrl = {gatewayUrl}");

                // Wait if necessary
                if (nextConnectionDelayMs > 0)
                {
                    log.LogVerbose($"[ConnectLoop] Waiting {nextConnectionDelayMs}ms before connecting socket...");

                    await Task.Delay(nextConnectionDelayMs, cancellationToken).ConfigureAwait(false);

                    nextConnectionDelayMs = 0;
                }

                try
                {
                    // Attempt to connect
                    await socket.ConnectAsync(new Uri($"{gatewayUrl}?v={GATEWAY_VERSION}&encoding=json"), cancellationToken)
                    .ConfigureAwait(false);

                    // At this point the socket has successfully connected
                    log.LogVerbose("[ConnectLoop] Socket connected successfully.");
                    break;
                }
                catch (WebSocketException wsex)
                {
                    UnsubscribeSocketEvents();

                    // Failed to connect
                    log.LogError("[ConnectLoop] Failed to connect: " +
                                 $"{wsex.WebSocketErrorCode} ({(int)wsex.WebSocketErrorCode}), {wsex.Message}");

                    // Invalidate the cached URL since we failed to connect the socket
                    log.LogVerbose("[ConnectLoop] Invalidating Gateway URL...");
                    GatewayUrlMemoryCache.InvalidateUrl();

                    // Wait 5s then retry
                    log.LogVerbose("[ConnectLoop] Waiting 5s before retrying...");
                    await Task.Delay(5000, cancellationToken).ConfigureAwait(false);
                }
            }

            // If the token is cancelled between the socket successfully connecting and the loop exiting,
            // do not throw an exception because the connection did technically complete before the cancel.
            if (socket == null || !socket.IsConnected)
            {
                // If the loop stopped from the token being cancelled, ensure an exception is still thrown.
                cancellationToken.ThrowIfCancellationRequested();
            }

            // If this is an automatic reconnection, fire OnReconnected event
            if (state == GatewayState.Connected)
            {
                if (resume)
                {
                    log.LogInfo("[ConnectLoop:Reconnection] Successfully started a resume.");
                }
                else
                {
                    log.LogInfo("[ConnectLoop:Reconnection] Successfully started creating a new session.");
                }

                OnReconnected?.Invoke(this, new GatewayReconnectedEventArgs(!resume));
            }
        }
Example #10
0
        public Client() : base(null)
        {
            ThreadDispatcher.EnsureCreated();

            base.OverrideBeingHostedCheck = true;

            base.OnLog       += (object sender, OnLogArgs e) => { ThreadDispatcher.Enqueue(() => OnLog?.Invoke(sender, e)); };
            base.OnConnected += ((object sender, OnConnectedArgs e) => { ThreadDispatcher.Enqueue(() => OnConnected?.Invoke(sender, e)); });

            base.OnJoinedChannel += ((object sender, OnJoinedChannelArgs e) => {
                ThreadDispatcher.Enqueue(() => OnJoinedChannel?.Invoke(sender, e));

                if (OnBeingHosted == null)
                {
                    return;
                }
                if (e.Channel.ToLower() != TwitchUsername && !OverrideBeingHostedCheck)
                {
                    ThreadDispatcher.Enqueue(() => throw new BadListenException("BeingHosted", "You cannot listen to OnBeingHosted unless you are connected to the broadcaster's channel as the broadcaster. You may override this by setting the TwitchClient property OverrideBeingHostedCheck to true."));
                }
            });

            base.OnIncorrectLogin         += ((object sender, OnIncorrectLoginArgs e) => { ThreadDispatcher.Enqueue(() => OnIncorrectLogin?.Invoke(sender, e)); });
            base.OnChannelStateChanged    += ((object sender, OnChannelStateChangedArgs e) => { ThreadDispatcher.Enqueue(() => OnChannelStateChanged?.Invoke(sender, e)); });
            base.OnUserStateChanged       += ((object sender, OnUserStateChangedArgs e) => { ThreadDispatcher.Enqueue(() => OnUserStateChanged?.Invoke(sender, e)); });
            base.OnMessageReceived        += ((object sender, OnMessageReceivedArgs e) => { ThreadDispatcher.Enqueue(() => OnMessageReceived?.Invoke(sender, e)); });
            base.OnWhisperReceived        += ((object sender, OnWhisperReceivedArgs e) => { ThreadDispatcher.Enqueue(() => OnWhisperReceived?.Invoke(sender, e)); });
            base.OnMessageSent            += ((object sender, OnMessageSentArgs e) => { ThreadDispatcher.Enqueue(() => OnMessageSent?.Invoke(sender, e)); });
            base.OnWhisperSent            += ((object sender, OnWhisperSentArgs e) => { ThreadDispatcher.Enqueue(() => OnWhisperSent?.Invoke(sender, e)); });
            base.OnChatCommandReceived    += ((object sender, OnChatCommandReceivedArgs e) => { ThreadDispatcher.Enqueue(() => OnChatCommandReceived?.Invoke(sender, e)); });
            base.OnWhisperCommandReceived += ((object sender, OnWhisperCommandReceivedArgs e) => { ThreadDispatcher.Enqueue(() => OnWhisperCommandReceived?.Invoke(sender, e)); });
            base.OnUserJoined             += ((object sender, OnUserJoinedArgs e) => { ThreadDispatcher.Enqueue(() => OnUserJoined?.Invoke(sender, e)); });
            base.OnModeratorJoined        += ((object sender, OnModeratorJoinedArgs e) => { ThreadDispatcher.Enqueue(() => OnModeratorJoined?.Invoke(sender, e)); });
            base.OnModeratorLeft          += ((object sender, OnModeratorLeftArgs e) => { ThreadDispatcher.Enqueue(() => OnModeratorLeft?.Invoke(sender, e)); });
            base.OnNewSubscriber          += ((object sender, OnNewSubscriberArgs e) => { ThreadDispatcher.Enqueue(() => OnNewSubscriber?.Invoke(sender, e)); });
            base.OnReSubscriber           += ((object sender, OnReSubscriberArgs e) => { ThreadDispatcher.Enqueue(() => OnReSubscriber?.Invoke(sender, e)); });
            base.OnHostLeft += ((object sender, EventArgs arg) => { ThreadDispatcher.Enqueue(() => OnHostLeft?.Invoke(sender, arg)); });
            base.OnExistingUsersDetected += ((object sender, OnExistingUsersDetectedArgs e) => { ThreadDispatcher.Enqueue(() => OnExistingUsersDetected?.Invoke(sender, e)); });
            base.OnUserLeft                         += ((object sender, OnUserLeftArgs e) => { ThreadDispatcher.Enqueue(() => OnUserLeft?.Invoke(sender, e)); });
            base.OnHostingStarted                   += ((object sender, OnHostingStartedArgs e) => { ThreadDispatcher.Enqueue(() => OnHostingStarted?.Invoke(sender, e)); });
            base.OnHostingStopped                   += ((object sender, OnHostingStoppedArgs e) => { ThreadDispatcher.Enqueue(() => OnHostingStopped?.Invoke(sender, e)); });
            base.OnDisconnected                     += ((object sender, OnDisconnectedEventArgs e) => { ThreadDispatcher.Enqueue(() => OnDisconnected?.Invoke(sender, e)); });
            base.OnConnectionError                  += ((object sender, OnConnectionErrorArgs e) => { ThreadDispatcher.Enqueue(() => OnConnectionError?.Invoke(sender, e)); });
            base.OnChatCleared                      += ((object sender, OnChatClearedArgs e) => { ThreadDispatcher.Enqueue(() => OnChatCleared?.Invoke(sender, e)); });
            base.OnUserTimedout                     += ((object sender, OnUserTimedoutArgs e) => { ThreadDispatcher.Enqueue(() => OnUserTimedout?.Invoke(sender, e)); });
            base.OnLeftChannel                      += ((object sender, OnLeftChannelArgs e) => { ThreadDispatcher.Enqueue(() => OnLeftChannel?.Invoke(sender, e)); });
            base.OnUserBanned                       += ((object sender, OnUserBannedArgs e) => { ThreadDispatcher.Enqueue(() => OnUserBanned?.Invoke(sender, e)); });
            base.OnModeratorsReceived               += ((object sender, OnModeratorsReceivedArgs e) => { ThreadDispatcher.Enqueue(() => OnModeratorsReceived?.Invoke(sender, e)); });
            base.OnChatColorChanged                 += ((object sender, OnChatColorChangedArgs e) => { ThreadDispatcher.Enqueue(() => OnChatColorChanged?.Invoke(sender, e)); });
            base.OnSendReceiveData                  += ((object sender, OnSendReceiveDataArgs e) => { ThreadDispatcher.Enqueue(() => OnSendReceiveData?.Invoke(sender, e)); });
            base.OnNowHosting                       += ((object sender, OnNowHostingArgs e) => { ThreadDispatcher.Enqueue(() => OnNowHosting?.Invoke(sender, e)); });
            base.OnBeingHosted                      += ((object sender, OnBeingHostedArgs e) => { ThreadDispatcher.Enqueue(() => OnBeingHosted?.Invoke(sender, e)); });
            base.OnRaidNotification                 += ((object sender, OnRaidNotificationArgs e) => { ThreadDispatcher.Enqueue(() => OnRaidNotification?.Invoke(sender, e)); });
            base.OnGiftedSubscription               += ((object sender, OnGiftedSubscriptionArgs e) => { ThreadDispatcher.Enqueue(() => OnGiftedSubscription?.Invoke(sender, e)); });
            base.OnRaidedChannelIsMatureAudience    += ((object sender, EventArgs arg) => { ThreadDispatcher.Enqueue(() => OnRaidedChannelIsMatureAudience?.Invoke(sender, arg)); });
            base.OnRitualNewChatter                 += ((object sender, OnRitualNewChatterArgs e) => { ThreadDispatcher.Enqueue(() => OnRitualNewChatter?.Invoke(sender, e)); });
            base.OnFailureToReceiveJoinConfirmation += ((object sender, OnFailureToReceiveJoinConfirmationArgs e) => { ThreadDispatcher.Enqueue(() => OnFailureToReceiveJoinConfirmation?.Invoke(sender, e)); });
            base.OnUnaccountedFor                   += ((object sender, OnUnaccountedForArgs e) => { ThreadDispatcher.Enqueue(() => OnUnaccountedFor?.Invoke(sender, e)); });
            base.OnSelfRaidError                    += ((object sender, EventArgs e) => { ThreadDispatcher.Enqueue(() => OnSelfRaidError?.Invoke(sender, e)); });
            base.OnNoPermissionError                += ((object sender, EventArgs e) => { ThreadDispatcher.Enqueue(() => OnNoPermissionError?.Invoke(sender, e)); });
            base.OnMessageCleared                   += ((object sender, OnMessageClearedArgs e) => { ThreadDispatcher.Enqueue(() => OnMessageCleared?.Invoke(sender, e)); });
            base.OnReconnected                      += ((object sender, OnReconnectedEventArgs e) => { ThreadDispatcher.Enqueue(() => OnReconnected?.Invoke(sender, e)); });
            base.OnWhisperThrottled                 += ((object sender, OnWhisperThrottledEventArgs e) => { ThreadDispatcher.Enqueue(() => OnWhisperThrottled?.Invoke(sender, e)); });
            base.OnMessageThrottled                 += ((object sender, OnMessageThrottledEventArgs e) => { ThreadDispatcher.Enqueue(() => OnMessageThrottled?.Invoke(sender, e)); });
            base.OnCommunitySubscription            += ((object sender, OnCommunitySubscriptionArgs e) => { ThreadDispatcher.Enqueue(() => OnCommunitySubscription?.Invoke(sender, e)); });
            base.OnError        += ((object sender, OnErrorEventArgs e) => { ThreadDispatcher.Enqueue(() => OnError?.Invoke(sender, e)); });
            base.OnVIPsReceived += ((object sender, OnVIPsReceivedArgs e) => { ThreadDispatcher.Enqueue(() => OnVIPsReceived?.Invoke(sender, e)); });
        }
Example #11
0
        public ScrumPokerHubClient(ILogger <ScrumPokerHubClient> logger, IJSRuntime jsRuntime, NavigationManager navigationManager, ProfileService profileService)
        {
            _logger         = logger;
            _profileService = profileService;

            _hubConnection = new HubConnectionBuilder()
                             .WithUrl(navigationManager.ToAbsoluteUri($"/{SignalRConstants.ScrumPokerHub}"))
                             .WithAutomaticReconnect()
                             .ConfigureLogging(builder =>
            {
                Assembly assembly = Assembly.LoadFrom("Blazor.Extensions.Logging.dll");
                Type logProvider  = assembly.GetType("Blazor.Extensions.Logging.BrowserConsoleLoggerProvider", true, true);
                ILoggerProvider loggingProvider = (ILoggerProvider)Activator.CreateInstance(logProvider, BindingFlags.CreateInstance, null, new[] { jsRuntime }, null);
                builder.AddProvider(loggingProvider);
            })
                             .Build();

            _hubConnection.Closed += ex =>
            {
                if (ex == null)
                {
                    _logger.LogWarning("SignalR connection closed without error");
                }
                else
                {
                    _logger.LogError(ex, "SignalR connection closed with error");
                }

                return(Task.CompletedTask);
            };

            _hubConnection.Reconnected += s =>
            {
                _logger.LogDebug($"Reconnected.");
                OnReconnected?.Invoke(this, s);
                return(Task.CompletedTask);
            };

            _hubConnection.On <PlayerVoted>(SignalRConstants.ReceiveVote, (evnt) =>
            {
                var encodedMsg = $"{evnt.UserId} {evnt.Vote}";
                _logger.LogDebug($"Vote Cast: {encodedMsg}");

                OnReceiveVote?.Invoke(this, evnt);
            });

            _hubConnection.On <PlayerJoined>(SignalRConstants.AddPlayer, (evnt) =>
            {
                _logger.LogDebug($"Player Joined: {evnt.UserName}");
                OnAddPlayer?.Invoke(this, evnt);
            });

            _hubConnection.On <PlayerEvent>(SignalRConstants.RemovePlayer, (evnt) =>
            {
                _logger.LogDebug($"Player Left: {evnt.UserId}");
                OnRemovePlayer?.Invoke(this, evnt);
            });

            _hubConnection.On <GameInfo>(SignalRConstants.ReceiveInitialGameState, (evnt) =>
            {
                _logger.LogDebug("Received GameInfo!");
                OnReceiveInitialGameState?.Invoke(this, evnt);
            });

            _hubConnection.On <PlayerEvent>(SignalRConstants.GameEnded, (evnt) =>
            {
                _logger.LogDebug("Game Deleted!");
                OnGameEnded?.Invoke(this, evnt);
            });

            _hubConnection.On <PlayerEvent>(SignalRConstants.ResetGame, (evnt) =>
            {
                _logger.LogDebug("Game Reset!");
                OnGameReset?.Invoke(this, evnt);
            });
        }
Example #12
0
 private void Gateway_OnReconnected(object sender, GatewayReconnectedEventArgs e)
 {
     OnReconnected?.Invoke(this, new ShardReconnectedEventArgs(this, e.IsNewSession));
 }