Beispiel #1
0
 private void onTickerUpdateReceived(RealtimeMessage message)
 {
     if (message is RealtimeMatch)
     {
         CurrentPrice = message.Price;
         TickerMessage priceData = new TickerMessage(message.Price);
         NotifyListener(priceData);
     }
 }
Beispiel #2
0
        public RealtimeMessage ParseMessage(byte[] message)
        {
            var jsonResponse = Encoding.UTF8.GetString(message, 0, message.Length);
            var jToken       = JToken.Parse(jsonResponse);
            var type         = jToken["type"]?.Value <string>();

            RealtimeMessage realtimeMessage = null;

            switch (type)
            {
            case "received":
                realtimeMessage = JsonConvert.DeserializeObject <RealtimeReceived>(jsonResponse);
                break;

            case "open":
                realtimeMessage = JsonConvert.DeserializeObject <RealtimeOpen>(jsonResponse);
                break;

            case "done":
                realtimeMessage = JsonConvert.DeserializeObject <RealtimeDone>(jsonResponse);
                break;

            case "match":
                realtimeMessage = JsonConvert.DeserializeObject <RealtimeMatch>(jsonResponse);
                break;

            case "change":
                realtimeMessage = JsonConvert.DeserializeObject <RealtimeChange>(jsonResponse);
                break;

            case "error":
                var error = JsonConvert.DeserializeObject <RealtimeError>(jsonResponse);
                throw new Exception(error.message);

            default:
                break;
            }

            return(realtimeMessage);
        }
Beispiel #3
0
        public static Task <HttpWebResponse> SendRealtimeMessage(CloudFunctionContext context, string receiverId, RealtimeMessage realtimeMessage)
        {
            if (ablyBasicAuthString == null)
            {
                ablyBasicAuthString = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(context.AblyServerKey));
            }

            return(HttpUtil.SendJsonPost(
                       $"https://rest.ably.io/channels/{receiverId}/messages",
                       JsonUtil.Serialize(new Dictionary <string, object> {
                { "data", realtimeMessage }
            }),
                       ablyBasicAuthString));
        }
Beispiel #4
0
        private async void Subscribe(string product, Action <RealtimeMessage> onMessageReceived)
        {
            //Logger.WriteLog("Subscribe method thread ID: " + Thread.CurrentThread.ManagedThreadId.ToString());

            if (String.IsNullOrWhiteSpace(product))
            {
                throw new ArgumentNullException("product");
            }

            if (onMessageReceived == null)
            {
                throw new ArgumentNullException("onMessageReceived", "Message received callback must not be null.");
            }
            JArray aj = new JArray();

            tempProduct           = product;
            tempOnMessageReceived = onMessageReceived;



            var uri = new Uri("wss://ws-feed.gdax.com");

            webSocketClient = new ClientWebSocket();
            var cancellationToken = new CancellationToken();

            //jStr.Append()
            var requestString = string.Format("");


            JObject jObj = new JObject();

            jObj.Add(new JProperty("type", "subscribe"));
            jObj.Add(new JProperty("product_ids", new JArray(product)));
            jObj.Add(new JProperty("channels", new JArray("matches")));

            //Console.WriteLine(jObj.ToString());



            try
            {
                var requestBytes = UTF8Encoding.UTF8.GetBytes(jObj.ToString());
                await webSocketClient.ConnectAsync(uri, cancellationToken);

                if (webSocketClient.State == WebSocketState.Open)
                {
                    Logger.WriteLog("Websocket connected");
                    var subscribeRequest      = new ArraySegment <byte>(requestBytes);
                    var sendCancellationToken = new CancellationToken();
                    await webSocketClient.SendAsync(subscribeRequest, WebSocketMessageType.Text, true, sendCancellationToken);



                    if (!tickerConnectedNotified)
                    {
                        tickerConnectedNotified = true;

                        //TickerConnectedEvent?.Invoke(null, EventArgs.Empty);
                        await Task.Run(() =>
                        {
                            TickerConnectedEvent?.Invoke(null, EventArgs.Empty);
                        });
                    }
                    TickerClientConnected    = true;
                    tickerDisconnectNotified = false;

                    while (webSocketClient.State == WebSocketState.Open)
                    {
                        var receiveCancellationToken = new CancellationToken();
                        var receiveBuffer            = new ArraySegment <byte>(new byte[1024 * 1024 * 1]); // 5MB buffer 1024 * 1024 * 5
                        var webSocketReceiveResult   = await webSocketClient.ReceiveAsync(receiveBuffer, receiveCancellationToken);

                        if (webSocketReceiveResult.Count == 0)
                        {
                            continue;
                        }

                        var jsonResponse = Encoding.UTF8.GetString(receiveBuffer.Array, 0, webSocketReceiveResult.Count);
                        //var jToken = JToken.Parse(jsonResponse);


                        JObject jToken = null;
                        try
                        {
                            jToken = JObject.Parse(jsonResponse);
                        }
                        catch (Exception)
                        {
                            Logger.WriteLog("Json parse error occured in websocket data");
                            continue;
                        }

                        var typeToken = jToken["type"];
                        if (typeToken == null)
                        {
                            continue;
                        }

                        var             type            = typeToken.Value <string>();
                        RealtimeMessage realtimeMessage = null;

                        //Console.WriteLine("MSG TYPE: {0}", type);

                        //look for only match messages

                        if (type == "match")
                        {
                            realtimeMessage = new RealtimeMatch(jToken);
                            //Logger.WriteLog("Ticker thread ID: " + Thread.CurrentThread.ManagedThreadId.ToString());
                        }


                        if (realtimeMessage == null)
                        {
                            continue;
                        }



                        onMessageReceived(realtimeMessage);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.WriteLog("Error in ticker websocket: " + ex.Message);

                TickerClientConnected = false;

                tickerConnectedNotified = false;
                if (!tickerDisconnectNotified)
                {
                    tickerDisconnectNotified = true;
                    //TickerDisconnectedEvent?.Invoke(null,EventArgs.Empty);

                    //notify ticker connected on a new thread
                    await Task.Run(() =>
                    {
                        TickerDisconnectedEvent?.Invoke(null, EventArgs.Empty);
                    });
                }
            }

            Reconnect(product, onMessageReceived);
        }