Esempio n. 1
0
        private void ProcessMessage(GatewayOp op)
        {
            if (op.Sequence != null)
            {
                m_lastRecievedSeq = op.Sequence;
            }

            _Logger?.Debug($"GatewayOp: {op.Op}");
            switch (op.Op)
            {
            case GatewayOpCode.Dispatch:
                if (op.EventName == "READY")
                {
                    m_sessionId = JObject.Parse(op.Data)["session_id"].ToString();
                }

                DispatchEvent(op.EventName, op.Data);
                break;

            case GatewayOpCode.Reconnect:
                AttemptConnection(m_gateway);
                break;

            case GatewayOpCode.Hello:
                m_heartbeatInterval = JObject.Parse(op.Data)["heartbeat_interval"].ToObject <int>();

                if (string.IsNullOrEmpty(m_sessionId))
                {
                    SendIdentity();
                }
                else
                {
                    var payload = new JObject();
                    payload["token"]      = m_token;
                    payload["session_id"] = m_sessionId;
                    payload["seq"]        = m_lastRecievedSeq;

                    SendData(payload.ToString());
                }
                break;

            case GatewayOpCode.InvalidSession:
                SendIdentity();
                break;

            case GatewayOpCode.HeartbeatACK:
                SendHeartbreat();
                break;
            }
        }
Esempio n. 2
0
        private async Task SocketLoopHandler()
        {
            var bufferData = new byte[1024 * 16];
            var buffer     = new ArraySegment <byte>(bufferData);

            if (AttemptConnection(m_gateway) == false)
            {
                return;
            }

            string parsedData = "";

            while (m_gatewaySocket.State == WebSocketState.Open)
            {
                try
                {
                    _Logger?.Debug($"Waiting to receive data...");
                    var recv = await m_gatewaySocket.ReceiveAsync(buffer, m_cancellationToken);

                    _Logger?.Debug($"Data received.");

                    if (recv.MessageType == WebSocketMessageType.Text)
                    {
                        string payload = System.Text.Encoding.UTF8.GetString(buffer.Array, 0, recv.Count);
                        parsedData += payload;

                        _Logger?.Debug($"Websocket Data Recieved: {parsedData}");
                    }
                    else if (recv.MessageType == WebSocketMessageType.Binary)
                    {
                        // TODO: Handle the binary data
                        _Logger?.Debug("Websocket Binary Data Received");
                        _Logger?.Debug($"Recieved {recv.Count} bytes");

                        if (recv.EndOfMessage)
                        {
                            _Logger?.Debug("End of message");
                        }
                    }
                    else if (recv.MessageType == WebSocketMessageType.Close)
                    {
                        _Logger?.Info($"Connection closed. Reason: {m_gatewaySocket.CloseStatus} - {m_gatewaySocket.CloseStatusDescription}");
                        if (!AttemptConnection(m_gateway))
                        {
                            break;
                        }
                    }

                    if (recv.EndOfMessage)
                    {
                        var payload = new GatewayOp(parsedData);
                        ProcessMessage(payload);
                        parsedData = "";
                    }
                }
                catch (Exception ex)
                {
                    parsedData = "";
                    _Logger?.Error($"Exception: {ex.Message}");

                    if (!AttemptConnection(m_gateway))
                    {
                        break;
                    }
                }
            }

            _Logger?.Info($"Connection closed. Reason: {m_gatewaySocket.CloseStatus} - {m_gatewaySocket.CloseStatusDescription}");
        }