#pragma once #include #include #include #include #include class QNetworkAccessManager; struct AuthResult { bool ok = false; bool twoFactorRequired = false; bool licenseMissing = false; QString error; QString playerName; // ${auth_player_name} QString uuid; // ${auth_uuid}, hex без дефисов QString accessToken; // ${auth_access_token} QString clientToken; // ${clientid} QString userType; // ${user_type}: legacy / msa / ELYBY // Только для аккаунтов Microsoft. QString refreshToken; // продлевает сессию без ввода пароля QString xuid; // ${auth_xuid} QDateTime expiresAt; // UTC-время, когда протухает accessToken }; class AuthService : public QObject { Q_OBJECT public: using Callback = std::function; explicit AuthService(QObject *parent = nullptr); static AuthResult offline(const QString &nickname); static QString generateClientToken(); void loginElyBy(const QString &login, const QString &password, const QString &clientToken, const QString &accessToken, Callback callback); void loginElyByWithTotp(const QString &login, const QString &password, const QString &totp, const QString &clientToken, Callback callback); void ensureAuthlibInjector(const QString &targetDir, std::function callback); signals: void progress(const QString &message); private: void postJson(const QString &endpoint, const QJsonObject &body, std::function handler); void authenticate(const QString &login, const QString &password, const QString &clientToken, Callback callback); QNetworkAccessManager *m_network; };