#pragma once #include #include #include #include #include #include #include "BoostAliases.h" #include "Common.h" #include "Compat.h" #include "RWMutex.h" #include "Sync.h" #include "VehicleData.h" class TServer; #ifdef BEAMMP_WINDOWS // for socklen_t #include #endif // WINDOWS struct TConnection final { ip::tcp::socket Socket; ip::tcp::endpoint SockAddr; }; class TClient final { public: using TSetOfVehicleData = std::vector; TClient(TServer& Server, ip::tcp::socket&& Socket); TClient(const TClient&) = delete; ~TClient(); TClient& operator=(const TClient&) = delete; void AddNewCar(int Ident, const std::string& Data); void SetCarData(int Ident, const std::string& Data); void SetCarPosition(int Ident, const std::string& Data); void SetName(const std::string& NewName) { Name = NewName; } void SetRoles(const std::string& NewRole) { Role = NewRole; } void SetIdentifier(const std::string& key, const std::string& value); std::string GetCarData(int Ident); std::string GetCarPositionRaw(int Ident); bool IsDisconnected() const { return !TCPSocket->is_open(); } // locks void DeleteCar(int Ident); [[nodiscard]] int GetOpenCarID() const; [[nodiscard]] int GetCarCount() const; void ClearCars(); void EnqueuePacket(const std::vector& Packet); void SetIsConnected(bool NewIsConnected) { IsConnected = NewIsConnected; } [[nodiscard]] TServer& Server() const; void UpdatePingTime(); int SecondsSinceLastPing(); Sync IsConnected = false; Sync IsSynced = false; Sync IsSyncing = false; Sync> Identifiers; Sync TCPSocket; Sync DownSocket; Sync UDPAddress {}; Sync UnicycleID = -1; Sync Role; Sync DID; Sync ID = -1; Sync IsGuest = false; Sync Name = std::string("Unknown Client"); Sync VehicleData; Sync> VehiclePosition; Sync>> MissedPacketsQueue; Sync> LastPingTime; friend class TNetwork; private: /// ONLY call after the client has been cleaned up, all cars deleted, etc. void CloseSockets(std::string_view Reason); void InsertVehicle(int ID, const std::string& Data); TServer& mServer; }; std::optional> GetClient(class TServer& Server, int ID);