示例#1
0
        private void InvokeMessageReceived(string channelName, string requestType, string message)
        {
            MessageType messageType = GetMessageType(requestType);

            switch (messageType)
            {
            case MessageType.OrderData:
                var orderMarketInfo = MarketInfo.ParseMarketInfo(channelName);
                var orders          = Helper.ToEntity <OrderResponse>(message);

                OnOrderMessage?.Invoke(orderMarketInfo.Exchange, orderMarketInfo.PrimaryCurrency, orderMarketInfo.SecondaryCurrency, orders.OrderData.Orders);
                break;

            case MessageType.TradeData:
                var tradeMarketInfo = MarketInfo.ParseMarketInfo(channelName);
                var trade           = Helper.ToEntity <TradeResponse>(message);

                OnTradeMessage?.Invoke(tradeMarketInfo.Exchange, tradeMarketInfo.PrimaryCurrency, tradeMarketInfo.SecondaryCurrency, trade.TradeData.Trade);
                break;

            case MessageType.BlockData:
                var blockInfo = BlockItem.ParseBlockInfo(channelName);

                OnBlockMessage?.Invoke(blockInfo, new BlockItem());
                break;

            case MessageType.FavoriteData:
                var favourites = Helper.ToEntity <FavoriteResponse>(message);

                OnFavoriteMessage?.Invoke(favourites.Data.FavoritesDataData.Favorites);
                break;

            case MessageType.NotificationData:
                var notification = Helper.ToEntity <NotificationResponse>(message);

                OnNotificationMessage?.Invoke(notification.NotificationData.NotificationDataData.NotificationDataItem);
                break;

            case MessageType.NewsData:
                var news = Helper.ToEntity <NewsResponse>(message);

                OnNewsMessage?.Invoke(news.NewsData.NewsDataItem);
                break;

            case MessageType.NewMarket:
                var newMarket = Helper.ToEntity <NewMarketResponse>(message);

                OnNewMarketMessage?.Invoke(newMarket.NewMarketData.NewMarketDataItem);
                break;
            }

            OnMessage?.Invoke(messageType, message);
        }
        void Start()
        {
            PushManager.Listener    = this;
            notificationDataOnStart = PushManager.NotificationDataOnStart;
            if (notificationDataOnStart.NotifyId != -1)
            {
                NotificationMessageOnStart?.Invoke(notificationDataOnStart);
            }
            PushManager.RegisterOnNotificationMessage((data) =>
            {
                OnNotificationMessage?.Invoke(data);
            });

            var token = PushManager.Token;

            Debug.Log($"[HMS] Push token from GetToken is {token}");
            if (token != null)
            {
                OnTokenSuccess?.Invoke(token);
            }
        }
示例#3
0
        private void _scClient_OnMessage(string message)
        {
            Debug.WriteLine(message);
            // check if this is a publish message
            var m = Regex.Match(message, @"^{""event""*.:*.""#publish""");

            if (!m.Success)
            {
                return;
            }

            // get the channel

            var jobj = Options.Serializer.Deserialize <dynamic>(message);

            string channel = jobj["data"]["channel"].ToString();

            string reqtype;

            if (channel.Contains('-') && !Guid.TryParse(channel, out _))
            {
                reqtype = channel.Substring(0, channel.IndexOf('-'));
            }
            else
            {
                reqtype = channel;
                if (Guid.TryParse(channel, out var cguid))
                {
                    if (string.Equals(cguid.ToString(), channel, StringComparison.OrdinalIgnoreCase))
                    {
                        // ok we have a private channel so lets find out what data we have
                        reqtype = jobj["data"]["data"]["MessageType"].ToString();
                    }
                }
            }

            var hascb = (from c in _subscribeCallbacs where c.Key == channel select c).Any();

            if (hascb)
            {
                var cbs = from c in _subscribeCallbacs where c.Key == channel select c.Value;
                foreach (var cb in cbs)
                {
                    cb.Invoke(GetMessageType(reqtype), message);
                }
            }

            switch (reqtype.ToUpper())
            {
            case "ORDER":
                var ominfo = ParseMarketInfo(channel);
                var orders = OrderResponse.FromJson(Options.Serializer, message);
                OnOrderMessage?.Invoke(ominfo.Exchange, ominfo.Curr1, ominfo.Curr2, orders.OrderData.Orders);
                OnMessage?.Invoke(MessageType.OrderData, message);
                break;

            case "TRADE":
                var tminfo = ParseMarketInfo(channel);
                var trade  = TradeResponse.FromJson(Options.Serializer, message);
                OnTradeMessage?.Invoke(tminfo.Exchange, tminfo.Curr1, tminfo.Curr2, trade.TradeData.Trade);
                OnMessage?.Invoke(MessageType.TradeData, message);
                break;

            case "BLOCK":
                OnBlockMessage?.Invoke(ParseBlockInfo(channel), new BlockItem());
                OnMessage?.Invoke(MessageType.BlockData, message);
                break;

            case "FAVORITE":
                OnFavoriteMessage?.Invoke(FavoriteResponse.FromJson(Options.Serializer, message).Data.FavoritesDataData.Favorites);
                OnMessage?.Invoke(MessageType.FavoriteData, message);
                break;

            case "NOTIFICATION":
                OnNotificationMessage?.Invoke(NotificationResponse.FromJson(Options.Serializer, message).NotificationData.NotificationDataData.NotificationDataItem);
                OnMessage?.Invoke(MessageType.NotificationData, message);
                break;

            case "NEWS":
                OnNewsMessage?.Invoke(NewsResponse.FromJson(Options.Serializer, message).NewsData.NewsDataItem);
                OnMessage?.Invoke(MessageType.NewsData, message);
                break;

            case "NEWMARKET":
                OnNewMarketMessage?.Invoke(NewMarketResponse.FromJson(Options.Serializer, message).NewMarketData.NewMarketDataData);
                OnMessage?.Invoke(MessageType.NewMarket, message);
                break;

            default:
                OnMessage?.Invoke(MessageType.Unknown, message);
                break;
            }
        }
        private WebSocket CreateWebSocket()
        {
            var url = EndpointHost.Replace("{region}", Region.DisplayName());

            var webSocket = new WebSocket(url)
            {
                SslConfiguration = { EnabledSslProtocols = SslProtocols.Tls12, CheckCertificateRevocation = _checkCertificateRevocation }
            };

            webSocket.OnOpen += (sender, eventArgs) =>
            {
                _state = State.LoggingIn;

                webSocket.SendAsync(
                    "{" +
                    $"\"client_id\": \"{Credential.ClientId}\"," +
                    $"\"client_secret\": \"{Credential.ClientSecret}\"," +
                    "\"x_gs2\": {" +
                    "\"service\": \"identifier\"," +
                    "\"component\": \"projectToken\"," +
                    "\"function\": \"login\"," +
                    "\"contentType\": \"application/json\"," +
                    $"\"requestId\": \"{Gs2SessionTaskId.LoginId.ToString()}\"" +
                    "}" +
                    "}",
                    null
                    );
            };

            webSocket.OnMessage += (sender, messageEventArgs) =>
            {
                if (messageEventArgs.IsText)
                {
                    var gs2WebSocketResponse = new Gs2WebSocketResponse(messageEventArgs.Data);

                    switch (_state)
                    {
                    case State.LoggingIn:
                        if (gs2WebSocketResponse.Gs2SessionTaskId == Gs2SessionTaskId.LoginId)
                        {
                            if (gs2WebSocketResponse.Error == null)
                            {
                                LoginResult loginResult = LoginResult.FromDict(gs2WebSocketResponse.Body);
                                if (loginResult.access_token != null)
                                {
                                    _state = State.Available;
                                    OpenCallback(loginResult.access_token, null);
                                }
                                else
                                {
                                    _lastGs2Exception = new UnknownException("No project token returned.");
                                    _state            = State.LoginFailed;

                                    webSocket.CloseAsync();
                                }
                            }
                            else
                            {
                                _lastGs2Exception = gs2WebSocketResponse.Error;
                                _state            = State.LoginFailed;

                                webSocket.CloseAsync();
                            }
                        }
                        break;

                    case State.Available:
                        if (gs2WebSocketResponse.Gs2SessionTaskId == Gs2SessionTaskId.InvalidId)
                        {
                            // API 応答以外のメッセージ
                            OnNotificationMessage?.Invoke(
                                NotificationMessage.FromDict(gs2WebSocketResponse.Body)
                                );
                        }
                        else
                        {
                            OnMessage(gs2WebSocketResponse.Gs2SessionTaskId, gs2WebSocketResponse);
                        }
                        break;

                    case State.Idle:
                    case State.Opening:
                    case State.LoginFailed:
                        break;
                    }
                }
            };

            webSocket.OnClose += (sender, closeEventArgs) =>
            {
                var state = _state;

                _state = State.Idle;

                switch (state)
                {
                case State.Idle:
                    // 来ない
                    break;

                case State.Opening:        // TODO: OnError を通ってからくるか確認
                case State.LoggingIn:
                case State.LoginFailed:
                    // Gs2Session としては Available になっていないので closeCallback ではなく openCallback に失敗を伝える
                    OpenCallback(null, _lastGs2Exception);
                    break;

                case State.Available:
                    // 自発的な切断も外部要因による切断もここ
                    CloseCallback();        // TODO: Cancel にわたすエラーを引数に取る
                    break;
                }
            };

            webSocket.OnError += (sender, errorEventArgs) =>
            {
                var gs2Exception = new SessionNotOpenException("Session no longer open.");

                switch (_state)
                {
                case State.Idle:
                    // 来ない
                    break;

                case State.Opening:
                    // この直後に OnClose が呼ばれる
                    _lastGs2Exception = gs2Exception;
                    break;

                case State.LoggingIn:
                    _lastGs2Exception = gs2Exception;
                    _state            = State.LoginFailed;
                    webSocket.CloseAsync();
                    break;

                case State.LoginFailed:
                    // 来ないはず
                    break;

                case State.Available:
                    // 実行中のタスクのどれが失敗したのかわからないので、全部失敗にする
                    // TODO
                    break;
                }
            };

            return(webSocket);
        }