diff --git a/src/OverteClient.cpp b/src/OverteClient.cpp index f096be3..6c91f6c 100644 --- a/src/OverteClient.cpp +++ b/src/OverteClient.cpp @@ -1,9 +1,11 @@ -// OverteClient.cpp #include "OverteClient.hpp" #include #include #include +#include +#include +#include #include #include #include @@ -15,7 +17,26 @@ using namespace std::chrono_literals; +// Generate a simple UUID-like string for session identification +static std::string generateUUID() { + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution<> dis(0, 255); + + std::stringstream ss; + ss << std::hex << std::setfill('0'); + for (int i = 0; i < 16; ++i) { + if (i == 4 || i == 6 || i == 8 || i == 10) ss << '-'; + ss << std::setw(2) << dis(gen); + } + return ss.str(); +} + bool OverteClient::connect() { + // Generate session UUID + m_sessionUUID = generateUUID(); + std::cout << "[OverteClient] Session UUID: " << m_sessionUUID << std::endl; + // Parse ws://host:port std::string url = m_domainUrl; if (url.empty()) url = "ws://127.0.0.1:40102"; @@ -76,6 +97,9 @@ bool OverteClient::connect() { std::cerr << "OverteClient: failed to connect one or more mixers" << std::endl; return false; } + + // Send domain connect request to initiate handshake + sendDomainConnectRequest(); m_useSimulation = (std::getenv("STARWORLD_SIMULATE") != nullptr); if (m_useSimulation) { diff --git a/src/OverteClient.hpp b/src/OverteClient.hpp index 2383fec..6304aee 100644 --- a/src/OverteClient.hpp +++ b/src/OverteClient.hpp @@ -49,9 +49,13 @@ public: private: void parseNetworkPackets(); // standards-aligned parsing (scaffold) void parseEntityPacket(const char* data, size_t len); + void parseDomainPacket(const char* data, size_t len); void handleDomainListReply(const char* data, size_t len); + void handleDomainConnectionDenied(const char* data, size_t len); void sendDomainListRequest(); + void sendDomainConnectRequest(); void sendEntityQuery(); + void sendPing(int fd, const sockaddr_storage& addr, socklen_t addrLen); std::string m_domainUrl; std::string m_host{"127.0.0.1"}; @@ -61,6 +65,8 @@ private: bool m_entityServer{false}; bool m_audioMixer{false}; bool m_useSimulation{false}; + bool m_domainConnected{false}; + std::string m_sessionUUID; // Our client session UUID // Very small in-process world state for testing std::unordered_map m_entities;