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; } }
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}"); }