1
Fork 0
mirror of https://github.com/redstrate/Astra.git synced 2025-04-20 11:47:46 +00:00
astra/launcher/include/launchercore.h

192 lines
6.4 KiB
C
Raw Normal View History

// SPDX-FileCopyrightText: 2023 Joshua Goins <josh@redstrate.com>
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QNetworkAccessManager>
#include <QtQml>
2023-09-16 18:37:42 -04:00
#include <qcorotask.h>
#include "accountmanager.h"
#include "headline.h"
#include "launchersettings.h"
#include "profile.h"
#include "profilemanager.h"
#include "steamapi.h"
class SapphireLogin;
class SquareEnixLogin;
class AssetUpdater;
class GameInstaller;
class CompatibilityToolInstaller;
class GameRunner;
class BenchmarkInstaller;
2024-07-28 11:17:30 -04:00
class SyncManager;
class LoginInformation : public QObject
{
Q_OBJECT
Q_PROPERTY(QString username MEMBER username)
Q_PROPERTY(QString password MEMBER password)
Q_PROPERTY(QString oneTimePassword MEMBER oneTimePassword)
Q_PROPERTY(Profile *profile MEMBER profile)
public:
2023-09-17 08:31:24 -04:00
explicit LoginInformation(QObject *parent = nullptr)
2023-07-30 10:11:14 -04:00
: QObject(parent)
{
}
Profile *profile = nullptr;
QString username, password, oneTimePassword;
};
struct LoginAuth {
QString SID;
int region = 2; // america?
int maxExpansion = 1;
// if empty, don't set on the client
QString lobbyhost, frontierHost;
};
class LauncherCore : public QObject
{
Q_OBJECT
2023-09-16 18:01:02 -04:00
QML_ELEMENT
QML_SINGLETON
Q_PROPERTY(bool loadingFinished READ isLoadingFinished NOTIFY loadingFinished)
Q_PROPERTY(bool isSteam READ isSteam CONSTANT)
Q_PROPERTY(bool isSteamDeck READ isSteamDeck CONSTANT)
Q_PROPERTY(bool isWindows READ isWindows CONSTANT)
Q_PROPERTY(LauncherSettings *settings READ settings CONSTANT)
Q_PROPERTY(ProfileManager *profileManager READ profileManager CONSTANT)
Q_PROPERTY(AccountManager *accountManager READ accountManager CONSTANT)
Q_PROPERTY(Headline *headline READ headline NOTIFY newsChanged)
Q_PROPERTY(Profile *currentProfile READ currentProfile WRITE setCurrentProfile NOTIFY currentProfileChanged)
2023-09-17 19:20:41 -04:00
Q_PROPERTY(Profile *autoLoginProfile READ autoLoginProfile WRITE setAutoLoginProfile NOTIFY autoLoginProfileChanged)
#ifdef BUILD_SYNC
2024-07-28 11:17:30 -04:00
Q_PROPERTY(SyncManager *syncManager READ syncManager CONSTANT)
#endif
public:
2023-09-16 18:01:02 -04:00
LauncherCore();
/// Initializes the Steamworks API.
void initializeSteam();
2023-09-16 18:01:02 -04:00
/// Begins the login process, and may call SquareBoot or SapphireLauncher depending on the profile type.
/// It's designed to be opaque as possible to the caller.
/// \note The login process is asynchronous.
Q_INVOKABLE void login(Profile *profile, const QString &username, const QString &password, const QString &oneTimePassword);
/// Attempts to log into a profile without LoginInformation, which may or may not work depending on a combination of the password failing, OTP not being
/// available to auto-generate, among other things. The launcher will still warn the user about any possible errors, however the call site will need to
/// check the result to see whether they need to "reset" or show a failed state or not. \note The login process is asynchronous.
2023-10-08 13:21:13 -04:00
Q_INVOKABLE bool autoLogin(Profile *profile);
/// Launches the game without patching, or logging in.
/// Meant to test if we can get to the title screen and is intended to fail to do anything else.
Q_INVOKABLE void immediatelyLaunch(Profile *profile);
Q_INVOKABLE GameInstaller *createInstaller(Profile *profile);
Q_INVOKABLE GameInstaller *createInstallerFromExisting(Profile *profile, const QString &filePath);
Q_INVOKABLE CompatibilityToolInstaller *createCompatInstaller();
Q_INVOKABLE BenchmarkInstaller *createBenchmarkInstaller(Profile *profile);
Q_INVOKABLE BenchmarkInstaller *createBenchmarkInstallerFromExisting(Profile *profile, const QString &filePath);
/// Fetches the avatar for @p account
void fetchAvatar(Account *account);
2023-10-11 14:49:24 -04:00
Q_INVOKABLE void clearAvatarCache();
Q_INVOKABLE void refreshNews();
Q_INVOKABLE void refreshLogoImage();
2023-09-17 08:31:24 -04:00
[[nodiscard]] Profile *currentProfile() const;
void setCurrentProfile(const Profile *profile);
[[nodiscard]] QString autoLoginProfileName() const;
[[nodiscard]] Profile *autoLoginProfile() const;
void setAutoLoginProfile(const Profile *value);
2023-10-11 14:49:24 -04:00
// Networking misc.
void buildRequest(const Profile &settings, QNetworkRequest &request);
void setupIgnoreSSL(QNetworkReply *reply);
[[nodiscard]] bool isLoadingFinished() const;
[[nodiscard]] bool isSteam() const;
[[nodiscard]] bool isSteamDeck() const;
[[nodiscard]] static bool isWindows();
[[nodiscard]] static bool needsCompatibilityTool();
[[nodiscard]] Q_INVOKABLE bool isPatching() const;
[[nodiscard]] Q_INVOKABLE bool supportsSync() const;
2023-10-11 14:49:24 -04:00
[[nodiscard]] QNetworkAccessManager *mgr();
[[nodiscard]] LauncherSettings *settings();
[[nodiscard]] ProfileManager *profileManager();
[[nodiscard]] AccountManager *accountManager();
[[nodiscard]] Headline *headline() const;
[[nodiscard]] QString cachedLogoImage() const;
#ifdef BUILD_SYNC
2024-07-28 11:17:30 -04:00
[[nodiscard]] SyncManager *syncManager() const;
#endif
2023-10-11 14:49:24 -04:00
Q_SIGNALS:
void loadingFinished();
void successfulLaunch();
void gameClosed(Profile *profile);
void loginError(QString message);
void dalamudError(QString message);
void miscError(QString message);
void stageChanged(QString message, QString explanation = {});
void stageIndeterminate();
void stageDeterminate(int min, int max, int value);
void newsChanged();
void currentProfileChanged();
2023-09-17 19:20:41 -04:00
void autoLoginProfileChanged();
void cachedLogoImageChanged();
void showWindow();
protected:
friend class Patcher;
bool m_isPatching = false;
private:
QCoro::Task<> beginLogin(LoginInformation &info);
2023-09-16 18:37:42 -04:00
QCoro::Task<> fetchNews();
QCoro::Task<> handleGameExit(const Profile *profile);
/// Updates FFXIV.cfg with some recommended options like turning the opening cutscene movie off
void updateConfig(const Account *account);
2023-09-17 08:31:24 -04:00
SteamAPI *m_steamApi = nullptr;
bool m_loadingFinished = false;
ProfileManager *m_profileManager = nullptr;
AccountManager *m_accountManager = nullptr;
SapphireLogin *m_sapphireLogin = nullptr;
SquareEnixLogin *m_squareEnixLogin = nullptr;
2023-09-17 08:31:24 -04:00
QNetworkAccessManager *m_mgr = nullptr;
Headline *m_headline = nullptr;
LauncherSettings *m_settings = nullptr;
GameRunner *m_runner = nullptr;
QString m_cachedLogoImage;
#ifdef BUILD_SYNC
2024-07-28 11:17:30 -04:00
SyncManager *m_syncManager = nullptr;
#endif
int m_currentProfileIndex = 0;
};