#pragma once #include "../types.hpp" #include #include #include #include #include #include #include namespace LibSock { namespace Server { class Server; class Clients; extern SP pServer; extern SP pClients; struct SRecvData { std::string data; const size_t size = 1024; bool good = false; bool isEmpty() const; void sanitize(); static constexpr char asciiEscape = 0x1B; //  }; enum eEventType : std::uint8_t { READ, WRITE }; class Client { public: ~Client(); const std::string &getIp() const; bool isAdmin() const; UP read(std::optional> cb = std::nullopt); UP read(const std::string &msg, std::optional> cb = std::nullopt); bool write(const std::string &msg, std::optional> cb = std::nullopt); template bool write(std::format_string fmt, Args &&...args); void run(); bool isValid(); private: Client(SP server = SP(pServer), SP clients = pClients, bool track = false, bool oneShot = true); WP self; SP m_sockfd; sockaddr_in m_addr; socklen_t m_addrLen = sizeof(m_addr); std::string m_ip; int m_port; bool m_track; bool m_oneShot; std::optional m_szReading = std::nullopt; void recvLoop(); friend class Clients; }; } // namespace Server } // namespace LibSock