protected override void HandleMessage(IEnumerable <Action <SymbolStatisticsEventArgs> > callbacks, string stream, string json) { try { SymbolStatisticsEventArgs eventArgs; if (json.IsJsonArray()) { // Simulate a single event time. var eventTime = DateTime.UtcNow.ToTimestamp().ToDateTime(); var statistics = JArray.Parse(json).Select(DeserializeSymbolStatistics).ToArray(); eventArgs = new SymbolStatisticsEventArgs(eventTime, statistics); } else { var jObject = JObject.Parse(json); var eventType = jObject["e"].Value <string>(); if (eventType == "24hrTicker") { var eventTime = jObject["E"].Value <long>().ToDateTime(); var statistics = DeserializeSymbolStatistics(jObject); eventArgs = new SymbolStatisticsEventArgs(eventTime, statistics); } else { Logger?.LogWarning($"{nameof(SymbolStatisticsClient)}.{nameof(HandleMessage)}: Unexpected event type ({eventType})."); return; } } try { if (callbacks != null) { foreach (var callback in callbacks) { callback(eventArgs); } } StatisticsUpdate?.Invoke(this, eventArgs); } catch (OperationCanceledException) { /* ignore */ } catch (Exception e) { Logger?.LogWarning(e, $"{nameof(SymbolStatisticsClient)}.{nameof(HandleMessage)}: Unhandled aggregate trade event handler exception."); } } catch (OperationCanceledException) { /* ignore */ } catch (Exception e) { Logger?.LogError(e, $"{nameof(SymbolStatisticsClient)}.{nameof(HandleMessage)}"); } }
/// <summary> /// Invokes event update when statistics are updated. /// </summary> private void OnStatisticsUpdate() { StatisticsUpdateEventArgs eventArgs = new StatisticsUpdateEventArgs() { Statistics = m_statistics }; StatisticsUpdate?.Invoke(this, eventArgs); }
protected override void OnWebSocketEvent(WebSocketStreamEventArgs args, IEnumerable <Action <SymbolStatisticsEventArgs> > callbacks) { Logger?.LogDebug($"{nameof(SymbolStatisticsWebSocketClient)}: \"{args.Json}\""); try { SymbolStatisticsEventArgs eventArgs; if (args.Json.IsJsonArray()) { // Simulate a single event time. var eventTime = DateTime.UtcNow.ToTimestamp().ToDateTime(); var statistics = JArray.Parse(args.Json).Select(DeserializeSymbolStatistics).ToArray(); eventArgs = new SymbolStatisticsEventArgs(eventTime, args.Token, statistics); } else { var jObject = JObject.Parse(args.Json); var eventType = jObject["e"].Value <string>(); if (eventType == "24hrTicker") { var eventTime = jObject["E"].Value <long>().ToDateTime(); var statistics = DeserializeSymbolStatistics(jObject); eventArgs = new SymbolStatisticsEventArgs(eventTime, args.Token, statistics); } else { Logger?.LogWarning($"{nameof(SymbolStatisticsWebSocketClient)}.{nameof(OnWebSocketEvent)}: Unexpected event type ({eventType})."); return; } } try { if (callbacks != null) { foreach (var callback in callbacks) { callback(eventArgs); } } StatisticsUpdate?.Invoke(this, eventArgs); } catch (OperationCanceledException) { } catch (Exception e) { if (!args.Token.IsCancellationRequested) { Logger?.LogError(e, $"{nameof(SymbolStatisticsWebSocketClient)}: Unhandled aggregate trade event handler exception."); } } } catch (OperationCanceledException) { } catch (Exception e) { if (!args.Token.IsCancellationRequested) { Logger?.LogError(e, $"{nameof(SymbolStatisticsWebSocketClient)}.{nameof(OnWebSocketEvent)}"); } } }
/// <summary> /// Deserialize JSON and raise <see cref="SymbolStatisticsTradeEventArgs"/> event. /// </summary> /// <param name="json"></param> /// <param name="token"></param> /// <param name="callback"></param> protected override void DeserializeJsonAndRaiseEvent(string json, CancellationToken token, Action <SymbolStatisticsEventArgs> callback = null) { Throw.IfNullOrWhiteSpace(json, nameof(json)); Logger?.LogDebug($"{nameof(SymbolStatisticsWebSocketClient)}: \"{json}\""); try { SymbolStatisticsEventArgs eventArgs; if (json.IsJsonArray()) { // Simulate a single event time. var eventTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); var statistics = JArray.Parse(json).Select(jToken => DeserializeSymbolStatistics(jToken)).ToArray(); eventArgs = new SymbolStatisticsEventArgs(eventTime, token, statistics); } else { var jObject = JObject.Parse(json); var eventType = jObject["e"].Value <string>(); if (eventType == "24hrTicker") { var eventTime = jObject["E"].Value <long>(); var statistics = DeserializeSymbolStatistics(jObject); eventArgs = new SymbolStatisticsEventArgs(eventTime, token, statistics); } else { Logger?.LogWarning($"{nameof(SymbolStatisticsWebSocketClient)}.{nameof(DeserializeJsonAndRaiseEvent)}: Unexpected event type ({eventType})."); return; } } try { callback?.Invoke(eventArgs); StatisticsUpdate?.Invoke(this, eventArgs); } catch (OperationCanceledException) { } catch (Exception e) { if (!token.IsCancellationRequested) { Logger?.LogError(e, $"{nameof(SymbolStatisticsWebSocketClient)}: Unhandled aggregate trade event handler exception."); } } } catch (OperationCanceledException) { } catch (Exception e) { if (!token.IsCancellationRequested) { Logger?.LogError(e, $"{nameof(SymbolStatisticsWebSocketClient)}.{nameof(DeserializeJsonAndRaiseEvent)}"); } } }