license login feature

This commit is contained in:
2026-09-01 22:25:23 +03:00
parent c25e071b29
commit d6986057d1
11 changed files with 1062 additions and 19 deletions
+32 -1
View File
@@ -13,6 +13,7 @@
struct AuthResult;
class AuthService;
class MsaAuthService;
class GameLauncher;
class VersionManifestService;
class VersionInstaller;
@@ -48,6 +49,10 @@ class LauncherBackend : public QObject
Q_PROPERTY(QString switchStatus READ switchStatus NOTIFY switchChanged)
Q_PROPERTY(bool busy READ busy NOTIFY busyChanged)
// Собран ли лаунчер с Qt WebEngine. Без него окно входа Microsoft
// показать нечем, и интерфейс не должен предлагать этот путь.
Q_PROPERTY(bool microsoftAvailable READ microsoftAvailable CONSTANT)
// Объединённый список для выпадающего меню версий: установленные, разделитель,
// затем весь каталог Mojang.
Q_PROPERTY(QVariantList versionCatalog READ versionCatalog NOTIFY versionCatalogChanged)
@@ -93,6 +98,7 @@ public:
QString switchStatus() const;
// Пока идёт загрузка версии, лаунчер тоже занят: кнопка запуска гаснет.
bool busy() const;
bool microsoftAvailable() const;
QVariantList versionCatalog() const;
bool catalogLoading() const;
@@ -128,6 +134,15 @@ public:
// loader, loaderVersion, resolvedVersionId.
Q_INVOKABLE void updateCustomBuild(int index, const QVariantMap &fields);
Q_INVOKABLE QVariantMap profileAt(int index) const;
// Вход в аккаунт Microsoft. profileIndex = -1 — вход ещё не привязан к
// профилю: он создастся по нику, который вернут Minecraft Services.
Q_INVOKABLE void startMicrosoftLogin(int profileIndex);
Q_INVOKABLE void finishMicrosoftLogin(const QString &code);
Q_INVOKABLE void cancelMicrosoftLogin();
// Разбор адреса, на который встроенное окно возвращается после входа.
// Живёт в C++, чтобы правила совпадения не разъезжались с сервисом.
Q_INVOKABLE QVariantMap inspectMicrosoftRedirect(const QString &url) const;
Q_INVOKABLE QVariantMap customBuildAt(int index) const;
Q_INVOKABLE void removeProfile(int index);
// Что именно потеряется при удалении — для текста предупреждения.
@@ -224,6 +239,12 @@ signals:
void launched(const QString &profileName, const QString &buildName, const QString &serverUrl);
void launchError(const QString &message);
void twoFactorRequired(const QString &profileName);
// Окну входа Microsoft: открыться на этом адресе.
void microsoftLoginUrlReady(const QString &url);
void microsoftLoginSucceeded(const QString &playerName);
void microsoftLoginFailed(const QString &message);
// Сессия профиля протухла настолько, что нужен повторный вход руками.
void microsoftReloginRequired(int profileIndex);
void gameOutput(const QString &line);
void gameFinished(int exitCode, bool crashed);
@@ -232,8 +253,11 @@ private:
{
int id = 0;
QString name, login, password;
QString authType = QStringLiteral("offline"); // offline | elyby
QString authType = QStringLiteral("offline"); // offline | elyby | microsoft
QString clientToken, accessToken, uuid, resolvedName, userType;
// Только для microsoft: продление сессии, ${auth_xuid} и срок жизни
// accessToken в ISO-8601 (чтобы класть в JSON без конвертеров).
QString refreshToken, xuid, tokenExpiry;
};
// Пользовательская сборка: имя, сервер, версия Minecraft и, начиная со
// второго этапа, выбранный модлоадер.
@@ -329,6 +353,8 @@ private:
void setBusy(bool busy);
void failLaunch(const QString &message);
void beginAuthentication();
void beginMicrosoftAuthentication();
void applyMicrosoftResult(Profile &profile, const AuthResult &auth);
void continueLaunch(const AuthResult &auth);
QList<Profile> m_profiles;
@@ -341,6 +367,7 @@ private:
int m_nextBuildId = 1;
AuthService *m_auth;
MsaAuthService *m_msa;
GameLauncher *m_launcher;
VersionManifestService *m_manifest;
VersionInstaller *m_installer;
@@ -356,6 +383,10 @@ private:
// когда установщик отчитается.
int m_loaderInstallBuildId = -1;
// Профиль, для которого открыто окно входа Microsoft. -1 — окно закрыто,
// -2 — вход для профиля, которого ещё нет.
int m_msaLoginProfile = -1;
// Каталог версий пересобирается только по изменениям: QML читает свойство
// помногу раз за кадр, пока открыт список.
mutable QVariantList m_catalog;