diff --git a/CryptoExchange.Net/Objects/ExchangeOptions.cs b/CryptoExchange.Net/Objects/ExchangeOptions.cs index a5450e1..3324bfb 100644 --- a/CryptoExchange.Net/Objects/ExchangeOptions.cs +++ b/CryptoExchange.Net/Objects/ExchangeOptions.cs @@ -36,7 +36,7 @@ namespace CryptoExchange.Net.Objects /// /// The log writers /// - public List LogWriters { get; set; } = new List() {new DebugTextWriter()}; + public List LogWriters { get; set; } = new List() { new DebugTextWriter() }; } public class ClientOptions: ExchangeOptions @@ -55,6 +55,25 @@ namespace CryptoExchange.Net.Objects /// The time the server has to respond to a request before timing out /// public TimeSpan RequestTimeout { get; set; } = TimeSpan.FromSeconds(30); + + public T Copy() where T:ClientOptions, new() + { + var copy = new T + { + BaseAddress = BaseAddress, + LogVerbosity = LogVerbosity, + Proxy = Proxy, + LogWriters = LogWriters, + RateLimiters = RateLimiters, + RateLimitingBehaviour = RateLimitingBehaviour, + RequestTimeout = RequestTimeout + }; + + if (ApiCredentials != null) + copy.ApiCredentials = new ApiCredentials(ApiCredentials.Key.GetString(), ApiCredentials.Secret.GetString()); + + return copy; + } } public class SocketClientOptions: ExchangeOptions @@ -63,5 +82,22 @@ namespace CryptoExchange.Net.Objects /// Time to wait between reconnect attempts /// public TimeSpan ReconnectInterval { get; set; } = TimeSpan.FromSeconds(5); + + public T Copy() where T : SocketClientOptions, new() + { + var copy = new T + { + BaseAddress = BaseAddress, + LogVerbosity = LogVerbosity, + Proxy = Proxy, + LogWriters = LogWriters, + ReconnectInterval = ReconnectInterval + }; + + if (ApiCredentials != null) + copy.ApiCredentials = new ApiCredentials(ApiCredentials.Key.GetString(), ApiCredentials.Secret.GetString()); + + return copy; + } } } diff --git a/CryptoExchange.Net/SocketClient.cs b/CryptoExchange.Net/SocketClient.cs index ab57ffd..6dca89c 100644 --- a/CryptoExchange.Net/SocketClient.cs +++ b/CryptoExchange.Net/SocketClient.cs @@ -121,8 +121,9 @@ namespace CryptoExchange.Net protected virtual void ProcessMessage(SocketSubscription subscription, string data) { log.Write(LogVerbosity.Debug, $"Socket {subscription.Socket.Id} received data: " + data); - foreach (var handler in subscription.DataHandlers) - handler(subscription, JToken.Parse(data)); + foreach (var handler in subscription.MessageHandlers) + if (handler(subscription, JToken.Parse(data))) + return; } /// @@ -163,6 +164,7 @@ namespace CryptoExchange.Net } else { + log.Write(LogVerbosity.Info, $"Socket {socket.Id} closed"); socket.Dispose(); lock (sockets) { diff --git a/CryptoExchange.Net/Sockets/SocketSubscription.cs b/CryptoExchange.Net/Sockets/SocketSubscription.cs index 490db1b..b687acf 100644 --- a/CryptoExchange.Net/Sockets/SocketSubscription.cs +++ b/CryptoExchange.Net/Sockets/SocketSubscription.cs @@ -13,7 +13,10 @@ namespace CryptoExchange.Net.Sockets public event Action ConnectionLost; public event Action ConnectionRestored; - public List> DataHandlers { get; set; } + /// + /// Message handlers for this subscription. Should return true if the message is handled and should not be distributed to the other handlers + /// + public List> MessageHandlers { get; set; } public List Events { get; set; } public IWebsocket Socket { get; set; } @@ -29,7 +32,7 @@ namespace CryptoExchange.Net.Sockets Events = new List(); waitingForEvents = new List(); - DataHandlers = new List>(); + MessageHandlers = new List>(); Socket.OnClose += () => {