Пример #1
0
        private void ServerOnMessage(object sender, MessageEventArgs evt)
        {
            var socket = (WsSocket)sender;

            try
            {
                var msgOrig    = JsonConvert.DeserializeObject <Message>(evt.Data);
                var actionName = msgOrig.ActionName?.ToLowerInvariant();

                var msg = msgOrig;
                if (_actionNameToDataType.ContainsKey(actionName))
                {
                    var type = _actionNameToDataType[actionName];
                    var data = DeserializeData(msgOrig.Data, type);
                    msg = new Message(socket)
                    {
                        ActionName = msgOrig.ActionName,
                        Type       = msgOrig.Type,
                        Data       = data,
                        Hash       = msgOrig.Hash
                    };
                }
                else
                {
                    msg.Sender = socket;
                }
                if (_actionFilters.Count != 0)
                {
                    lock (_actionFiltersLock)
                    {
                        if (_actionFilters.Any(x => !x(msg)))
                        {
                            return;
                        }
                    }
                }

                if (!InvokeHandlers(actionName, msg))
                {
                    UnhandledMessage?.Invoke(this, msg);
                }
            }
            catch (Exception e)
            {
                var message = new Message
                {
                    Type = MessageType.Response,
                    Data = "Received unknown data."
                };
                var text = JsonConvert.SerializeObject(message);
                socket.Send(text);
                Logger.Error(e, $"Failed to handle WebSocket message: {evt.Data}");
            }
        }
Пример #2
0
        protected async Task Listen()
        {
            while (true)
            {
                var buffer = await _input.ReadLineAsync();

                var splitBuffer = buffer.Split();

                if (splitBuffer[0].Equals("PING"))
                {
                    await SendPong(buffer);
                }
                else if (splitBuffer[1].Equals("PRIVMSG"))
                {
                    var parsedMessage = IrcMessage.ParseMessage(buffer);
                    var parsedUser    = IrcMessage.ParseUser(buffer);
                    MessageReceived?.Invoke(parsedMessage, parsedUser);
                }
                else
                {
                    UnhandledMessage?.Invoke(buffer);
                }
            }
        }
Пример #3
0
 internal void RaiseUnhandledMessage(JsonResponse message)
 {
     UnhandledMessage?.Invoke(this, message);
 }
Пример #4
0
 protected virtual void OnUnhandledMessage(MessageContext context)
 {
     UnhandledMessage?.Invoke(context);
 }
Пример #5
0
        async void Run()
        {
            var messageParser = new TwitchMessageParser();
            int retries       = 0;

            while (Connection != null)
            {
                try
                {
                    string data = Connection.Read();
                    if (string.IsNullOrEmpty(data))
                    {
                        // Failed to read, try again.
                        if (retries >= 3)
                        {
                            break;
                        }
                        retries += 1;
                        await Task.Delay(1000);
                    }
                    else
                    {
                        retries = 0;
                    }

                    var message = messageParser.Parse(data);
                    if (message == null)
                    {
                        continue;
                    }

                    // Completely ignore certain messages.
                    if (ignoredCommands.Contains(message.Command))
                    {
                        continue;
                    }

                    // Process specified commands.
                    ITwitchCommandProcessor commandProcessor;
                    if (commandProcessors.TryGetValue(message.Command, out commandProcessor))
                    {
                        commandProcessor.Process(Connection, message);
                    }
                    // Raise unhandled messages to UI thread.
                    else
                    {
                        Dispatcher.Invoke(() => UnhandledMessage?.Invoke(message));
                    }
                }
                catch (IOException)
                {
                    continue;
                }
            }

            try
            {
                // Raise disconnected event.
                Dispatcher.Invoke(() => Disconnected?.Invoke());
            }
            catch (TaskCanceledException) {}
        }