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}"); } }
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); } } }
internal void RaiseUnhandledMessage(JsonResponse message) { UnhandledMessage?.Invoke(this, message); }
protected virtual void OnUnhandledMessage(MessageContext context) { UnhandledMessage?.Invoke(context); }
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) {} }