#pragma once #include #include #include #include #include #include #include #include #include #include #include struct ServerInfo { std::string shard_id; int current_load; int max_capacity; }; class ClientApp : public QWidget { Q_OBJECT public: ClientApp(const std::string& master_ip, int master_port, QWidget* parent = nullptr); void enableLogging(bool enabled); void resetToFactory(); private slots: void onLoginClicked(); void onRegisterClicked(); void onServerSelected(); private: void setupUI(); void connectMaster(); void sendAuthRequest(const std::string& username, const std::string& password); void sendRegisterRequest(const std::string& username, const std::string& password); void requestServerList(); std::string argon2Hash(const std::string& input, const std::string& salt); QStackedWidget* stack_; QWidget* loginScreen_; QLineEdit* loginUsername_; QLineEdit* loginPassword_; QPushButton* loginBtn_; QPushButton* createAccountBtn_; QWidget* registerScreen_; QLineEdit* regUsername_; QLineEdit* regPassword_; QLineEdit* regPasswordConfirm_; QPushButton* regBtn_; QPushButton* backBtn_; QWidget* serverScreen_; QListWidget* serverList_; QPushButton* serverSelectBtn_; QPushButton* serverQuitBtn_; SSL_CTX* ssl_ctx_; SSL* ssl_; int master_fd_; std::string master_ip_; int master_port_; bool logging_; std::vector servers_; };