#pragma once #include "IThreaded.h" #include "RWMutex.h" #include "TScopedTimer.h" #include #include #include #include #include "BoostAliases.h" class TClient; class TNetwork; class TPPSMonitor; class TServer final { public: using TClientSet = std::unordered_set>; TServer(const std::vector& Arguments); void InsertClient(const std::shared_ptr& Ptr); void RemoveClient(const std::weak_ptr&); // in Fn, return true to continue, return false to break void ForEachClient(const std::function)>& Fn); size_t ClientCount() const; static void GlobalParser(const std::weak_ptr& Client, std::vector&& Packet, TPPSMonitor& PPSMonitor, TNetwork& Network); static void HandleEvent(TClient& c, const std::string& Data); RWMutex& GetClientMutex() const { return mClientsMutex; } const TScopedTimer UptimeTimer; // asio io context io_context& IoCtx() { return mIoCtx; } private: io_context mIoCtx {}; TClientSet mClients; mutable RWMutex mClientsMutex; static void ParseVehicle(TClient& c, const std::string& Pckt, TNetwork& Network); static bool ShouldSpawn(TClient& c, const std::string& CarJson, int ID); static bool IsUnicycle(TClient& c, const std::string& CarJson); static void Apply(TClient& c, int VID, const std::string& pckt); static void HandlePosition(TClient& c, const std::string& Packet); }; struct BufferView { uint8_t* Data { nullptr }; size_t Size { 0 }; const uint8_t* data() const { return Data; } uint8_t* data() { return Data; } size_t size() const { return Size; } };