using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using WebSocket.Clients; using WebSocket.Interfaces; namespace Knoks.CryptoExchanges.ExchangeClients { class CexExchange: IExchangeContainer { internal class PairSocket { public WebSocket4NetSocket socket { get; set; } public CexClient client { get; set; } public Tuple pair { get; set; } } #region Members private List socketsPool; private int exchangeId; public UpdateData updateData { get; set; } public IDictionary ReplaceSymbols { get; set; } #endregion /// /// ctor /// /// public CexExchange(int initExchangeId) { this.exchangeId = initExchangeId; socketsPool = new List(); } /// /// Init connection to exchange /// /// /// public async Task InitClient(UpdateData saveDataEvent) { this.updateData = saveDataEvent; await Task.CompletedTask; } /// /// Start pairs requesting /// /// /// public async Task RequestPairsData(List> pairs) { foreach (var pair in pairs) { var poolItem = socketsPool.FirstOrDefault(x => x.pair == pair); if (poolItem == null) { var socket = new CexWebsocket4Net(); socket.Create("wss://ws.cex.io/ws/"); socket.Sign((s) => new ConsoleWebClient( this.updateData, this.exchangeId, (ss) => { var client = new CexClient(ss); poolItem = new PairSocket() { socket = socket, client = client, pair = pair }; socketsPool.Add(poolItem); return client; }, s)); await poolItem.socket.Connect(); poolItem.client.StartRequest(new string[] { $"{pair.Item1}-{pair.Item2}" }); } } var socketsToStop = socketsPool.Where(socket => !pairs.Contains(socket.pair)); await Task.WhenAll(socketsToStop.Select(x => x.socket.Close())); socketsPool.RemoveAll(socket => !pairs.Contains(socket.pair)); } /// /// Close connection for all pool items /// /// public async Task CloseConnection() { await Task.WhenAll(this.socketsPool.Select(x => x.socket.Close())); } /// /// Force to reconnect /// /// public async Task Reconnect() { await Task.CompletedTask; } } }