diff --git a/src/TServer.cpp b/src/TServer.cpp index f4b0a45..a80c1ee 100644 --- a/src/TServer.cpp +++ b/src/TServer.cpp @@ -156,6 +156,13 @@ size_t TServer::ClientCount() const { return mClients.size(); } +std::mt19937_64 TimeSyncRandomDevice(std::random_device{}()); + +auto TimeSyncStart = std::chrono::steady_clock::now() + - std::chrono::duration_cast( + std::chrono::duration(std::uniform_real_distribution(0.0, 2592000.0)(TimeSyncRandomDevice)) + ); + void TServer::GlobalParser(const std::weak_ptr& Client, std::vector&& Packet, TPPSMonitor& PPSMonitor, TNetwork& Network, bool udp) { constexpr std::string_view ABG = "ABG:"; if (Packet.size() >= ABG.size() && std::equal(Packet.begin(), Packet.begin() + ABG.size(), ABG.begin(), ABG.end())) { @@ -210,6 +217,24 @@ void TServer::GlobalParser(const std::weak_ptr& Client, std::vector(std::chrono::steady_clock::now() - TimeSyncStart).count(); + + std::vector ServerTime(sizeof(uint64_t)); + std::memcpy(ServerTime.data(), &Time, sizeof(uint64_t)); + + auto Data = Packet; + + beammp_debugf("Sending server time {} to client '{}' ({}), client time: {}", Time, LockedClient->GetName(), LockedClient->GetID(), reinterpret_cast(Data.data())); + + Data.insert(Data.end(), ServerTime.begin(), ServerTime.end()); + + if (!Network.Respond(*LockedClient, Data, true)) { + Network.DisconnectClient(*LockedClient, "Failed to send time"); + } + } + return; case 'H': // initial connection if (udp) { beammp_debugf("Received 'H' packet over UDP from client '{}' ({}), ignoring it", LockedClient->GetName(), LockedClient->GetID());