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);
        }
Esempio n. 2
0
        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);
        }