#pragma once #include "IThreaded.h" #include "RWMutex.h" #include "TScopedTimer.h" #include #include #include #include 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); std::weak_ptr InsertNewClient(); 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::string Packet, TPPSMonitor& PPSMonitor, TNetwork& Network); static void HandleEvent(TClient& c, const std::string& Data); RWMutex& GetClientMutex() const { return mClientsMutex; } const TScopedTimer UptimeTimer; private: 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); };