diff --git a/CryptoExchange.Net/Trackers/UserData/UserFuturesDataTracker.cs b/CryptoExchange.Net/Trackers/UserData/UserFuturesDataTracker.cs index 8b6e93b..cf14ead 100644 --- a/CryptoExchange.Net/Trackers/UserData/UserFuturesDataTracker.cs +++ b/CryptoExchange.Net/Trackers/UserData/UserFuturesDataTracker.cs @@ -27,7 +27,7 @@ namespace CryptoExchange.Net.Trackers.UserData private readonly IListenKeyRestClient? _listenKeyRestClient; private readonly IFuturesSymbolRestClient _futuresSymbolRestClient; private readonly IBalanceRestClient _balanceRestClient; - private readonly IBalanceSocketClient _balanceSocketClient; + private readonly IBalanceSocketClient? _balanceSocketClient; private readonly IFuturesOrderRestClient _futuresOrderRestClient; private readonly IFuturesOrderSocketClient _futuresOrderSocketClient; private readonly IPositionSocketClient _positionSocketClient; @@ -79,10 +79,10 @@ namespace CryptoExchange.Net.Trackers.UserData _exchangeParameters = exchangeParameters; _futuresSymbolRestClient = (IFuturesSymbolRestClient)restClient; _balanceRestClient = (IBalanceRestClient)restClient; - _balanceSocketClient = (IBalanceSocketClient)socketClient; _futuresOrderRestClient = (IFuturesOrderRestClient)restClient; _futuresOrderSocketClient = (IFuturesOrderSocketClient)socketClient; _positionSocketClient = (IPositionSocketClient)socketClient; + _balanceSocketClient = socketClient as IBalanceSocketClient; _listenKeyRestClient = restClient as IListenKeyRestClient; _userTradeSocketClient = socketClient as IUserTradeSocketClient; } @@ -113,17 +113,20 @@ namespace CryptoExchange.Net.Trackers.UserData listenKey = lkResult.Data; } - var subBalanceResult = await ExchangeHelpers.ProcessQueuedAsync( + if (_balanceSocketClient != null) + { + var subBalanceResult = await ExchangeHelpers.ProcessQueuedAsync( async handler => await _balanceSocketClient.SubscribeToBalanceUpdatesAsync(new SubscribeBalancesRequest(listenKey, exchangeParameters: _exchangeParameters), handler, ct: _cts!.Token).ConfigureAwait(false), x => HandleBalanceUpdateAsync(UpdateSource.Push, x.Data)).ConfigureAwait(false); - if (!subBalanceResult) - { - _logger.LogWarning("Failed to start UserFuturesDataTracker; failed to subscribe to balance stream: {Error}", subBalanceResult.Error!.Message); - return subBalanceResult; - } + if (!subBalanceResult) + { + _logger.LogWarning("Failed to start UserFuturesDataTracker; failed to subscribe to balance stream: {Error}", subBalanceResult.Error!.Message); + return subBalanceResult; + } - _balanceSubscription = subBalanceResult.Data; - subBalanceResult.Data.SubscriptionStatusChanged += BalanceSubscriptionStatusChanged; + _balanceSubscription = subBalanceResult.Data; + subBalanceResult.Data.SubscriptionStatusChanged += BalanceSubscriptionStatusChanged; + } var subOrderResult = await ExchangeHelpers.ProcessQueuedAsync( async handler => await _futuresOrderSocketClient.SubscribeToFuturesOrderUpdatesAsync(new SubscribeFuturesOrderRequest(listenKey, exchangeParameters: _exchangeParameters), handler, ct: _cts!.Token).ConfigureAwait(false), @@ -352,7 +355,7 @@ namespace CryptoExchange.Net.Trackers.UserData private void CheckConnectedChanged() { - Connected = _balanceSubscription?.SubscriptionStatus == SubscriptionStatus.Subscribed + Connected = (_balanceSubscription == null || _balanceSubscription?.SubscriptionStatus == SubscriptionStatus.Subscribed) && _orderSubscription?.SubscriptionStatus == SubscriptionStatus.Subscribed && (_tradeSubscription == null || _tradeSubscription.SubscriptionStatus == SubscriptionStatus.Subscribed) && (_positionSubscription == null || _positionSubscription.SubscriptionStatus == SubscriptionStatus.Subscribed); diff --git a/CryptoExchange.Net/Trackers/UserData/UserSpotDataTracker.cs b/CryptoExchange.Net/Trackers/UserData/UserSpotDataTracker.cs index d33d833..bef2804 100644 --- a/CryptoExchange.Net/Trackers/UserData/UserSpotDataTracker.cs +++ b/CryptoExchange.Net/Trackers/UserData/UserSpotDataTracker.cs @@ -24,7 +24,7 @@ namespace CryptoExchange.Net.Trackers.UserData private readonly IListenKeyRestClient? _listenKeyRestClient; private readonly ISpotSymbolRestClient _spotSymbolRestClient; private readonly IBalanceRestClient _balanceRestClient; - private readonly IBalanceSocketClient _balanceSocketClient; + private readonly IBalanceSocketClient? _balanceSocketClient; private readonly ISpotOrderRestClient _spotOrderRestClient; private readonly ISpotOrderSocketClient _spotOrderSocketClient; private readonly IUserTradeSocketClient? _userTradeSocketClient; @@ -66,9 +66,9 @@ namespace CryptoExchange.Net.Trackers.UserData _spotSymbolRestClient = (ISpotSymbolRestClient)restClient; _balanceRestClient = (IBalanceRestClient)restClient; - _balanceSocketClient = (IBalanceSocketClient)socketClient; _spotOrderRestClient = (ISpotOrderRestClient)restClient; _spotOrderSocketClient = (ISpotOrderSocketClient)socketClient; + _balanceSocketClient = socketClient as IBalanceSocketClient; _listenKeyRestClient = restClient as IListenKeyRestClient; _userTradeSocketClient = socketClient as IUserTradeSocketClient; } @@ -98,17 +98,20 @@ namespace CryptoExchange.Net.Trackers.UserData listenKey = lkResult.Data; } - var subBalanceResult = await ExchangeHelpers.ProcessQueuedAsync( + if (_balanceSocketClient != null) + { + var subBalanceResult = await ExchangeHelpers.ProcessQueuedAsync( async handler => await _balanceSocketClient.SubscribeToBalanceUpdatesAsync(new SubscribeBalancesRequest(listenKey, exchangeParameters: _exchangeParameters), handler, ct: _cts!.Token).ConfigureAwait(false), x => HandleBalanceUpdateAsync(UpdateSource.Push, x.Data)).ConfigureAwait(false); - if (!subBalanceResult) - { - _logger.LogWarning("Failed to start UserDataTracker; failed to subscribe to balance stream: {Error}", subBalanceResult.Error!.Message); - return subBalanceResult; - } + if (!subBalanceResult) + { + _logger.LogWarning("Failed to start UserDataTracker; failed to subscribe to balance stream: {Error}", subBalanceResult.Error!.Message); + return subBalanceResult; + } - _balanceSubscription = subBalanceResult.Data; - subBalanceResult.Data.SubscriptionStatusChanged += BalanceSubscriptionStatusChanged; + _balanceSubscription = subBalanceResult.Data; + subBalanceResult.Data.SubscriptionStatusChanged += BalanceSubscriptionStatusChanged; + } var subOrderResult = await ExchangeHelpers.ProcessQueuedAsync( async handler => await _spotOrderSocketClient.SubscribeToSpotOrderUpdatesAsync(new SubscribeSpotOrderRequest(listenKey, exchangeParameters: _exchangeParameters), handler, ct: _cts!.Token).ConfigureAwait(false), @@ -266,7 +269,7 @@ namespace CryptoExchange.Net.Trackers.UserData private void CheckConnectedChanged() { - Connected = _balanceSubscription?.SubscriptionStatus == SubscriptionStatus.Subscribed + Connected = (_balanceSubscription == null || _balanceSubscription?.SubscriptionStatus == SubscriptionStatus.Subscribed) && _orderSubscription?.SubscriptionStatus == SubscriptionStatus.Subscribed && (_tradeSubscription == null || _tradeSubscription.SubscriptionStatus == SubscriptionStatus.Subscribed); }