#pragma once #include "../common/net/reliable_stream_connection.h" #include "../common/event/timer.h" #include struct WorldServer { std::string long_name; std::string address; int type; std::string lang; std::string region; int status; int players; }; class LoginConnection { public: LoginConnection(const std::string &username, const std::string &password, const std::string &host, int host_port, const std::string &server); void OnCanLoginToWorld(std::function cb) { m_on_can_login_world = cb; } ~LoginConnection(); private: void OnNewConnection(std::shared_ptr connection); void OnStatusChangeActive(std::shared_ptr conn, EQ::Net::DbProtocolStatus from, EQ::Net::DbProtocolStatus to); void OnStatusChangeInactive(std::shared_ptr conn, EQ::Net::DbProtocolStatus from, EQ::Net::DbProtocolStatus to); void OnPacketRecv(std::shared_ptr conn, const EQ::Net::Packet &p); void Kill(); void Start(); void SendSessionReady(); void SendLogin(); void SendServerRequest(); void SendPlayRequest(uint32_t id); void ProcessLoginResponse(const EQ::Net::Packet &p); void ProcessServerPacketList(const EQ::Net::Packet &p); void ProcessServerPlayResponse(const EQ::Net::Packet &p); std::unique_ptr m_connection_manager; std::shared_ptr m_connection; bool m_connecting; std::unique_ptr m_connect_timer; std::string m_username; std::string m_password; std::string m_host; int m_host_port; std::string m_server; std::string m_key; uint32_t m_dbid; std::map m_world_servers; std::function m_on_can_login_world; };