diff --git a/CryptoExchange.Net/Clients/SocketApiClient.cs b/CryptoExchange.Net/Clients/SocketApiClient.cs index c8b0e7d..a0f43a1 100644 --- a/CryptoExchange.Net/Clients/SocketApiClient.cs +++ b/CryptoExchange.Net/Clients/SocketApiClient.cs @@ -402,7 +402,7 @@ namespace CryptoExchange.Net if (!authenticated || socket.Authenticated) return new CallResult(true); - _logger.Log(LogLevel.Debug, $"Attempting to authenticate {socket.SocketId}"); + _logger.Log(LogLevel.Debug, $"Socket {socket.SocketId} Attempting to authenticate"); var result = await AuthenticateSocketAsync(socket).ConfigureAwait(false); if (!result) { @@ -414,6 +414,7 @@ namespace CryptoExchange.Net return new CallResult(result.Error); } + _logger.Log(LogLevel.Debug, $"Socket {socket.SocketId} authenticated"); socket.Authenticated = true; return new CallResult(true); } @@ -511,7 +512,7 @@ namespace CryptoExchange.Net if (typeof(T) == typeof(string)) { var stringData = (T)Convert.ChangeType(messageEvent.JsonData.ToString(), typeof(T)); - dataHandler(new DataEvent(stringData, null, OutputOriginalData ? messageEvent.OriginalData : null, messageEvent.ReceivedTimestamp)); + dataHandler(new DataEvent(stringData, null, OutputOriginalData ? messageEvent.OriginalData : null, messageEvent.ReceivedTimestamp, null)); return; } @@ -522,7 +523,7 @@ namespace CryptoExchange.Net return; } - dataHandler(new DataEvent(desResult.Data, null, OutputOriginalData ? messageEvent.OriginalData : null, messageEvent.ReceivedTimestamp)); + dataHandler(new DataEvent(desResult.Data, null, OutputOriginalData ? messageEvent.OriginalData : null, messageEvent.ReceivedTimestamp, null)); } var subscription = request == null diff --git a/CryptoExchange.Net/Converters/BoolConverter.cs b/CryptoExchange.Net/Converters/BoolConverter.cs index bb24714..fb8431f 100644 --- a/CryptoExchange.Net/Converters/BoolConverter.cs +++ b/CryptoExchange.Net/Converters/BoolConverter.cs @@ -40,11 +40,13 @@ namespace CryptoExchange.Net.Converters case "yes": case "y": case "1": + case "on": return true; case "false": case "no": case "n": case "0": + case "off": return false; } diff --git a/CryptoExchange.Net/Objects/Enums.cs b/CryptoExchange.Net/Objects/Enums.cs index d01922f..d91a341 100644 --- a/CryptoExchange.Net/Objects/Enums.cs +++ b/CryptoExchange.Net/Objects/Enums.cs @@ -124,4 +124,19 @@ /// Closest } + + /// + /// Type of the update + /// + public enum SocketUpdateType + { + /// + /// A update + /// + Update, + /// + /// A snapshot, generally send at the start of the connection + /// + Snapshot + } } diff --git a/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs b/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs index 2dc3b62..d6404f4 100644 --- a/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs +++ b/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs @@ -464,7 +464,7 @@ namespace CryptoExchange.Net.OrderBook { var pbList = _processBuffer.ToList(); if (pbList.Count > 0) - _logger.Log(LogLevel.Debug, $"Processing {pbList.Count} buffered updates"); + _logger.Log(LogLevel.Debug, $"{Id} Processing {pbList.Count} buffered updates"); foreach (var bufferEntry in pbList) { @@ -661,7 +661,7 @@ namespace CryptoExchange.Net.OrderBook if (_stopProcessing) { - _logger.Log(LogLevel.Trace, "Skipping message because of resubscribing"); + _logger.Log(LogLevel.Trace, $"{Id} Skipping message because of resubscribing"); continue; } diff --git a/CryptoExchange.Net/Sockets/DataEvent.cs b/CryptoExchange.Net/Sockets/DataEvent.cs index d89e189..d6e3151 100644 --- a/CryptoExchange.Net/Sockets/DataEvent.cs +++ b/CryptoExchange.Net/Sockets/DataEvent.cs @@ -1,4 +1,5 @@ -using System; +using CryptoExchange.Net.Objects; +using System; namespace CryptoExchange.Net.Sockets { @@ -23,35 +24,23 @@ namespace CryptoExchange.Net.Sockets /// public string? OriginalData { get; set; } + /// + /// Type of update + /// + public SocketUpdateType? UpdateType { get; set; } + /// /// The received data deserialized into an object /// public T Data { get; set; } - /// - /// Ctor - /// - /// - /// - public DataEvent(T data, DateTime timestamp) - { - Data = data; - Timestamp = timestamp; - } - - internal DataEvent(T data, string? topic, DateTime timestamp) - { - Data = data; - Topic = topic; - Timestamp = timestamp; - } - - internal DataEvent(T data, string? topic, string? originalData, DateTime timestamp) + internal DataEvent(T data, string? topic, string? originalData, DateTime timestamp, SocketUpdateType? updateType) { Data = data; Topic = topic; OriginalData = originalData; Timestamp = timestamp; + UpdateType = updateType; } /// @@ -62,7 +51,7 @@ namespace CryptoExchange.Net.Sockets /// public DataEvent As(K data) { - return new DataEvent(data, Topic, OriginalData, Timestamp); + return new DataEvent(data, Topic, OriginalData, Timestamp, UpdateType); } /// @@ -74,7 +63,20 @@ namespace CryptoExchange.Net.Sockets /// public DataEvent As(K data, string? topic) { - return new DataEvent(data, topic, OriginalData, Timestamp); + return new DataEvent(data, topic, OriginalData, Timestamp, UpdateType); + } + + /// + /// Create a new DataEvent with data in the from of type K based on the current DataEvent. OriginalData and Timestamp will be copied over + /// + /// The type of the new data + /// The new data + /// The new topic + /// The type of update + /// + public DataEvent As(K data, string? topic, SocketUpdateType updateType) + { + return new DataEvent(data, topic, OriginalData, Timestamp, updateType); } } } diff --git a/CryptoExchange.Net/Sockets/SocketConnection.cs b/CryptoExchange.Net/Sockets/SocketConnection.cs index 79964e8..49f6917 100644 --- a/CryptoExchange.Net/Sockets/SocketConnection.cs +++ b/CryptoExchange.Net/Sockets/SocketConnection.cs @@ -259,7 +259,7 @@ namespace CryptoExchange.Net.Sockets var reconnectSuccessful = await ProcessReconnectAsync().ConfigureAwait(false); if (!reconnectSuccessful) { - _logger.Log(LogLevel.Warning, $"Failed reconnect processing: {reconnectSuccessful.Error}, reconnecting again"); + _logger.Log(LogLevel.Warning, $"Socket {SocketId} Failed reconnect processing: {reconnectSuccessful.Error}, reconnecting again"); await _socket.ReconnectAsync().ConfigureAwait(false); } else @@ -348,7 +348,7 @@ namespace CryptoExchange.Net.Sockets // Answer to a timed out request, unsub if it is a subscription request if (pendingRequest.Subscription != null) { - _logger.Log(LogLevel.Warning, "Received subscription info after request timed out; unsubscribing. Consider increasing the RequestTimeout"); + _logger.Log(LogLevel.Warning, $"Socket {SocketId} Received subscription info after request timed out; unsubscribing. Consider increasing the RequestTimeout"); _ = ApiClient.UnsubscribeAsync(this, pendingRequest.Subscription).ConfigureAwait(false); } } @@ -714,7 +714,7 @@ namespace CryptoExchange.Net.Sockets var result = await ApiClient.RevitalizeRequestAsync(subscription.Request!).ConfigureAwait(false); if (!result) { - _logger.Log(LogLevel.Warning, "Failed request revitalization: " + result.Error); + _logger.Log(LogLevel.Warning, $"Socket {SocketId} Failed request revitalization: " + result.Error); return result.As(false); } }