public IqOptionWebSocketClient(Action <IqOptionWebSocketClient> initialSetup = null, string host = "iqoption.com") { Client = new WebSocket($"wss://{host}/echo/websocket"); MessageReceivedObservable = Observable.Using( () => Client, _ => Observable .FromEventPattern <EventHandler <MessageReceivedEventArgs>, MessageReceivedEventArgs>( handler => _.MessageReceived += handler, handler => _.MessageReceived -= handler)) .Select(x => x.EventArgs.Message) .SubscribeOn(new EventLoopScheduler()) .Publish() .RefCount(); MessageReceivedObservable.Subscribe(x => { var a = x.JsonAs <WsMessageBase <object> >(); switch (a.Name?.ToLower()) { case "heartbeat": { var value = x.JsonAs <HeartBeat>(); _heartbeat.OnNext(value.Message); break; } case "timesync": { var value = x.JsonAs <ServerTime>(); ServerTime = value.Message; break; } case "profile": { if (!a.Message.Equals(false)) { var profile = x.JsonAs <WsMessageBase <Profile> >().Message; _profileSubject.OnNext(profile); } break; } case "instruments": { var result = x.JsonAs <WsMessageBase <InstrumentsResult> >().Message; _logger.Verbose($"Received Inst. => instruments ({result.Type.ToString()})"); _instrumentResultSet[result.Type] = result.Instruments; _instrumentResultSetSubject.OnNext(_instrumentResultSet); if (_instrumentResultSet.All(i => i.Value.Any())) { _instrumentResultSetSubject.OnCompleted(); } break; } case "profit-top-user-moved-up": { break; } case "activecommissionchange": { break; } case "user-tournament-position-changed": { break; } case "chat-state-updated": { break; } case "front": { break; } case "listinfodata": { var result = x.JsonAs <WsMessageBase <InfoData[]> >(); _infoDataSubject.OnNext(result?.Message); var info = result?.Message.FirstOrDefault(); if (info != null) { _logger.Verbose( $"info-received => {info.UserId} {info.Win} {info.Direction} {info.Sum} {info.Active} @{info.Value} exp {info.ExpTime}({info.Expired})"); } break; } case "buycomplete": { var result = x.JsonAs <BuyCompleteResultMessage>().Message; if (result.IsSuccessful) { var buyResult = x.JsonAs <BuyCompleteResultMessage>().Message.Result; _logger.Verbose( $"buycompleted => {buyResult.UserId} {buyResult.Type} {buyResult.Direction} {buyResult.Price} {(ActivePair) buyResult.Act} @{buyResult.Value} "); } else { _logger.Warning($"{Profile?.UserId}\t{result.GetMessageDescription()}"); } _buyResultSubject.OnNext(result.Result); break; } case "candles": { var result = x.JsonAs <GetCandleItemsResultMessage>(); if (result != null) { CandleCollections = result.Message; } break; } case "candle-generated": { var candle = x.JsonAs <CurrentCandleInfoResultMessage>(); if (candle != null) { _candleInfoSubject.OnNext(candle.Message); CurrentCandleInfo = candle.Message; } break; } default: { _logger.Verbose(Profile?.Id + " => " + a.AsJson()); break; } } }, ex => { _logger.Error(ex.Message); }); initialSetup?.Invoke(this); }
public IqOptionWebSocketClient(Action <IqOptionWebSocketClient> initialSetup = null, string host = "iqoption.com") { Client = new WebSocket($"wss://{host}/echo/websocket"); //set up shred obs. InstrumentResultSetObservable = _instrumentResultSetSubject.PublishLast().RefCount(); BuyResultObservable = _buyResulSjSubject.Publish().RefCount(); MessageReceivedObservable = Observable.Using( () => Client, _ => Observable .FromEventPattern <EventHandler <MessageReceivedEventArgs>, MessageReceivedEventArgs>( handler => _.MessageReceived += handler, handler => _.MessageReceived -= handler)) .Select(x => x.EventArgs.Message) .SubscribeOn(new EventLoopScheduler()) .Publish() .RefCount(); MessageReceivedObservable.Subscribe(x => { var a = x.JsonAs <WsRequestMessageBase <object> >(); switch (a.Name?.ToLower()) { case "heartbeat": { var value = x.JsonAs <HeartBeat>(); _heartbeat.OnNext(value.HearBeatDateTime); break; } case "timesync": { _timeSync = long.Parse(a.Message.ToString()); _timeSyncSubject.OnNext(_timeSync); break; } case "profile": { if (!a.Message.Equals(false)) { Profile = x.JsonAs <WsRequestMessageBase <Profile> >().Message; } break; } case "instruments": { var result = x.JsonAs <WsRequestMessageBase <InstrumentsResult> >().Message; _logger.LogTrace($"Received Inst. => instruments ({result.Type.ToString()})"); _instrumentResultSet[result.Type] = result.Instruments; _instrumentResultSetSubject.OnNext(_instrumentResultSet); if (_instrumentResultSet.All(i => i.Value.Any())) { _instrumentResultSetSubject.OnCompleted(); } break; } case "profit-top-user-moved-up": { break; } case "activecommissionchange": { break; } case "user-tournament-position-changed": { break; } case "chat-state-updated": { break; } case "front": { break; } case "listinfodata": { var result = x.JsonAs <WsRequestMessageBase <InfoData[]> >(); _infoDataSubject.OnNext(result?.Message); var info = result?.Message.FirstOrDefault(); if (info != null) { _logger.LogInformation( $"info-received => {info.UserId} {info.Win} {info.Direction} {info.Sum} {info.Active} @{info.Value}"); } break; } case "buycomplete": { var result = x.JsonAs <WsRequestMessageBase <WsMsgResult <object> > >().Message; if (result.IsSuccessful) { var buyResult = x.JsonAs <WsRequestMessageBase <WsMsgResult <BuyResult> > >().Message.Result; _logger.LogInformation( $"buycompleted => {buyResult.UserId} {buyResult.Type} {buyResult.Direction} {buyResult.Price} {(ActivePair)buyResult.Act} @{buyResult.Value} "); _buyResulSjSubject.OnNext(buyResult); } else { var ex = string.Join(", ", result.Message?.ToList()); _logger.LogError($"{this.Profile?.UserId}\t{ex}", ex); //_buyResulSjSubject.OnNext(BuyResult.BuyResultError(result.Message)); } break; } default: { _logger.LogDebug(Profile?.Id + " => " + a.AsJson()); break; } } }, ex => { _logger.LogCritical(ex.Message); }); initialSetup?.Invoke(this); }