From 8ffe3a7519b27eb798718015274db87456c79778 Mon Sep 17 00:00:00 2001 From: HappyTanuki Date: Sun, 4 May 2025 14:50:52 +0900 Subject: [PATCH] =?UTF-8?q?snowflake=20id=EA=B0=80=20=EC=9D=B4=EC=83=81?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EC=83=9D=EC=84=B1=EB=90=98=EB=8A=94=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../include/ClientManager/ClientManager.hpp | 1 + Client/src/ClientManager/ClientManager.cpp | 13 ++++++++++- impl/Utils/GenerateID.cpp | 23 +++++++++++-------- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/Client/include/ClientManager/ClientManager.hpp b/Client/include/ClientManager/ClientManager.hpp index 4ecf85b..5f8228e 100644 --- a/Client/include/ClientManager/ClientManager.hpp +++ b/Client/include/ClientManager/ClientManager.hpp @@ -53,6 +53,7 @@ public: } void processresponsePacket(ResponsePacket responsePacket, IOCPPASSINDATA* data); + void processLoginResponsePacket(LoginResponsePacket loginResponsePacket, IOCPPASSINDATA* data); void processRoomCreateResponsePacket(RoomCreateResponsePacket roomCreateResponsePacket, IOCPPASSINDATA* data); void processRoomListResponse(RoomListResponsePacket roomListResponsePacket, IOCPPASSINDATA* data); void processRoomJoinResponsePacket(RoomJoinResponsePacket roomJoinResponsePacket, IOCPPASSINDATA* data); diff --git a/Client/src/ClientManager/ClientManager.cpp b/Client/src/ClientManager/ClientManager.cpp index c904a50..fb31d15 100644 --- a/Client/src/ClientManager/ClientManager.cpp +++ b/Client/src/ClientManager/ClientManager.cpp @@ -31,7 +31,13 @@ void ClientManager::_IOCPClient(Chattr::ThreadPool* thread, Chattr::IOCPPASSINDA PacketSet packetSet = packetParser(pack); pack.convToN(); switch (packetSet) { - case PacketSet::LOGINRESPONSE: + case PacketSet::LOGINRESPONSE: { + LoginResponsePacket loginResponsePacket; + std::memcpy(&loginResponsePacket.serialized, &pack.serialized, 8 + packetLength); + loginResponsePacket.convToH(); + processLoginResponsePacket(loginResponsePacket, data); + } + break; case PacketSet::ROOMCREATERESPONSE: case PacketSet::ROOMLISTRESPONSE: case PacketSet::ROOMJOINRESPONSE: @@ -152,6 +158,11 @@ void ClientManager::processresponsePacket(ResponsePacket responsePacket, IOCPPAS // data->IOCPInstance->send(data, 1, 0); } + +void ClientManager::processLoginResponsePacket(LoginResponsePacket loginResponsePacket, IOCPPASSINDATA* data) { + ::memcpy(&myID_.snowflake, loginResponsePacket.__data.yourId, sizeof(Snowflake)); +} + void ClientManager::processRoomCreateResponsePacket(RoomCreateResponsePacket roomCreateResponsePacket, Chattr::IOCPPASSINDATA* data) { // std::string roomName( // (char*)roomCreateResponsePacket.__data.data, diff --git a/impl/Utils/GenerateID.cpp b/impl/Utils/GenerateID.cpp index de82d3d..445adf4 100644 --- a/impl/Utils/GenerateID.cpp +++ b/impl/Utils/GenerateID.cpp @@ -3,25 +3,28 @@ namespace Chattr { Snowflake GenerateID() { - static struct _EPOCH { - _EPOCH() { + static struct EpochInitializer { + EpochInitializer() { EPOCH = std::chrono::system_clock::now(); } std::chrono::system_clock::time_point EPOCH; - } __EPOCH__; + } epochInitializer; static std::mutex snowflakeGenerateMutex_; std::lock_guard lock(snowflakeGenerateMutex_); -#ifdef _WIN32 - DWORD tid = GetCurrentThreadId(); -#elif __linux__ - pthread_t tid = pthread_self(); -#endif - static int sequence = 0; + + std::size_t tid; + #ifdef _WIN32 + tid = static_cast(GetCurrentThreadId()); + #elif __linux__ + tid = static_cast(pthread_self()); + #endif + + thread_local static int sequence = 0; Snowflake id = {}; - auto timestamp = std::chrono::duration_cast(std::chrono::system_clock::now() - __EPOCH__.EPOCH); + auto timestamp = std::chrono::duration_cast(std::chrono::system_clock::now() - epochInitializer.EPOCH); id.timestamp = timestamp.count(); id.instance = tid; id.sequence = sequence++;