feat(gameplay): add Session class and UUID generation utility

This commit is contained in:
2026-06-23 15:54:01 +08:00
parent 27e3cd6851
commit 1acfeef9e6
4 changed files with 135 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
#pragma once
#include <asio.hpp>
#include <deque>
#include <memory>
#include <string>
namespace Cubed {
using asio::ip::tcp;
class Session : public std::enable_shared_from_this<Session> {
public:
Session(tcp::socket socket);
~Session();
void start();
void send();
void close();
const std::string& uuid() const;
private:
static constexpr int HEADER_LEN = 8;
static constexpr uint32_t MAX_PACKET_SIZE = 4 * 1024 * 1024;
tcp::socket m_socket;
std::vector<char> m_read_buffer;
std::deque<std::vector<char>> m_write_queue;
std::mutex m_write_mutex;
std::string m_uuid;
asio::awaitable<void> read();
asio::awaitable<void> write();
};
} // namespace Cubed

View File

@@ -0,0 +1,42 @@
#pragma once
#include <array>
#include <chrono>
#include <cstdint>
#include <iomanip>
#include <iostream>
#include <random>
#include <sstream>
#include <string>
namespace Cubed {
inline std::string generate_uuid() {
static std::mt19937_64 rng(
std::chrono::steady_clock::now().time_since_epoch().count() ^
(std::random_device{}()));
std::uniform_int_distribution<uint64_t> dist(0, UINT64_MAX);
uint64_t a = dist(rng);
uint64_t b = dist(rng);
std::array<uint8_t, 16> bytes{};
for (int i = 0; i < 8; ++i) {
bytes[i] = (a >> (56 - 8 * i)) & 0xFF;
bytes[8 + i] = (b >> (56 - 8 * i)) & 0xFF;
}
bytes[6] = (bytes[6] & 0x0F) | 0x40;
bytes[8] = (bytes[8] & 0x3F) | 0x80;
std::ostringstream ss;
ss << std::hex << std::setfill('0');
for (size_t i = 0; i < bytes.size(); ++i) {
if (i == 4 || i == 6 || i == 8 || i == 10) {
ss << '-';
}
ss << std::setw(2) << static_cast<int>(bytes[i]);
}
return ss.str();
}
} // namespace Cubed