private void _scClient_OnMessage(string message) { Debug.WriteLine(message); // check if this is a publish message var m = Regex.Match(message, @"^{""event""*.:*.""#publish"""); if (!m.Success) { return; } // get the channel var jobj = Options.Serializer.Deserialize <dynamic>(message); string channel = jobj["data"]["channel"].ToString(); string reqtype; if (channel.Contains('-') && !Guid.TryParse(channel, out _)) { reqtype = channel.Substring(0, channel.IndexOf('-')); } else { reqtype = channel; if (Guid.TryParse(channel, out var cguid)) { if (string.Equals(cguid.ToString(), channel, StringComparison.OrdinalIgnoreCase)) { // ok we have a private channel so lets find out what data we have reqtype = jobj["data"]["data"]["MessageType"].ToString(); } } } var hascb = (from c in _subscribeCallbacs where c.Key == channel select c).Any(); if (hascb) { var cbs = from c in _subscribeCallbacs where c.Key == channel select c.Value; foreach (var cb in cbs) { cb.Invoke(GetMessageType(reqtype), message); } } switch (reqtype.ToUpper()) { case "ORDER": var ominfo = ParseMarketInfo(channel); var orders = OrderResponse.FromJson(Options.Serializer, message); OnOrderMessage?.Invoke(ominfo.Exchange, ominfo.Curr1, ominfo.Curr2, orders.OrderData.Orders); OnMessage?.Invoke(MessageType.OrderData, message); break; case "TRADE": var tminfo = ParseMarketInfo(channel); var trade = TradeResponse.FromJson(Options.Serializer, message); OnTradeMessage?.Invoke(tminfo.Exchange, tminfo.Curr1, tminfo.Curr2, trade.TradeData.Trade); OnMessage?.Invoke(MessageType.TradeData, message); break; case "BLOCK": OnBlockMessage?.Invoke(ParseBlockInfo(channel), new BlockItem()); OnMessage?.Invoke(MessageType.BlockData, message); break; case "FAVORITE": OnFavoriteMessage?.Invoke(FavoriteResponse.FromJson(Options.Serializer, message).Data.FavoritesDataData.Favorites); OnMessage?.Invoke(MessageType.FavoriteData, message); break; case "NOTIFICATION": OnNotificationMessage?.Invoke(NotificationResponse.FromJson(Options.Serializer, message).NotificationData.NotificationDataData.NotificationDataItem); OnMessage?.Invoke(MessageType.NotificationData, message); break; case "NEWS": OnNewsMessage?.Invoke(NewsResponse.FromJson(Options.Serializer, message).NewsData.NewsDataItem); OnMessage?.Invoke(MessageType.NewsData, message); break; case "NEWMARKET": OnNewMarketMessage?.Invoke(NewMarketResponse.FromJson(Options.Serializer, message).NewMarketData.NewMarketDataData); OnMessage?.Invoke(MessageType.NewMarket, message); break; default: OnMessage?.Invoke(MessageType.Unknown, message); break; } }