1
Fork 0
mirror of https://github.com/redstrate/Astra.git synced 2025-04-22 20:47:45 +00:00

Make Dalamud asset downloading more reliable

This uses the complete package which should prevent partial downloads.
In the future it should check for the hashes they give us.
This commit is contained in:
Joshua Goins 2024-02-24 11:48:02 -05:00
parent c346e848c5
commit 51715ca3be
2 changed files with 19 additions and 26 deletions

View file

@ -61,6 +61,7 @@ private:
int m_remoteDalamudAssetVersion = -1; int m_remoteDalamudAssetVersion = -1;
QJsonArray m_remoteDalamudAssetArray; QJsonArray m_remoteDalamudAssetArray;
QString m_remoteDalamudDownloadUrl; QString m_remoteDalamudDownloadUrl;
QString m_remoteDalamudAssetPackageUrl;
QString m_remoteCompatibilityToolVersion; QString m_remoteCompatibilityToolVersion;
QString m_remoteDxvkToolVersion; QString m_remoteDxvkToolVersion;
// TODO: hardcoded // TODO: hardcoded

View file

@ -130,6 +130,7 @@ QCoro::Task<bool> AssetUpdater::checkRemoteDalamudAssetVersion()
const QJsonDocument doc = QJsonDocument::fromJson(reply->readAll()); const QJsonDocument doc = QJsonDocument::fromJson(reply->readAll());
m_remoteDalamudAssetVersion = doc.object()["version"_L1].toInt(); m_remoteDalamudAssetVersion = doc.object()["version"_L1].toInt();
m_remoteDalamudAssetPackageUrl = doc.object()["packageUrl"_L1].toString();
m_remoteDalamudAssetArray = doc.object()["assets"_L1].toArray(); m_remoteDalamudAssetArray = doc.object()["assets"_L1].toArray();
qInfo(ASTRA_LOG) << "Dalamud asset remote version" << m_remoteDalamudAssetVersion; qInfo(ASTRA_LOG) << "Dalamud asset remote version" << m_remoteDalamudAssetVersion;
@ -265,36 +266,27 @@ QCoro::Task<bool> AssetUpdater::installDalamudAssets()
{ {
Q_EMIT launcher.stageChanged(i18n("Updating Dalamud assets...")); Q_EMIT launcher.stageChanged(i18n("Updating Dalamud assets..."));
QFutureSynchronizer<void> synchronizer; const QNetworkRequest request = QNetworkRequest(QUrl(m_remoteDalamudAssetPackageUrl));
Utility::printRequest(QStringLiteral("GET"), request);
for (const auto &assetObject : m_remoteDalamudAssetArray) { const auto reply = launcher.mgr()->get(request);
const QNetworkRequest assetRequest(QUrl(assetObject.toObject()["url"_L1].toString())); co_await reply;
Utility::printRequest(QStringLiteral("GET"), assetRequest);
const auto assetReply = launcher.mgr()->get(assetRequest);
const auto future = QtFuture::connect(assetReply, &QNetworkReply::finished).then([this, assetReply, assetObject] {
const QString fileName = assetObject.toObject()["fileName"_L1].toString();
const QString dirPath = fileName.left(fileName.lastIndexOf('/'_L1));
const QString path = m_dalamudAssetDir.absoluteFilePath(dirPath);
Utility::createPathIfNeeded(path);
QFile file(m_dalamudAssetDir.absoluteFilePath(assetObject.toObject()["fileName"_L1].toString()));
file.open(QIODevice::WriteOnly);
file.write(assetReply->readAll());
file.close();
});
synchronizer.addFuture(future);
}
co_await QtConcurrent::run([&synchronizer] {
synchronizer.waitForFinished();
});
qInfo(ASTRA_LOG) << "Finished downloading Dalamud assets"; qInfo(ASTRA_LOG) << "Finished downloading Dalamud assets";
QFile file(m_tempDir.filePath(QStringLiteral("dalamud-assets.zip")));
file.open(QIODevice::WriteOnly);
file.write(reply->readAll());
file.close();
if (!extractZip(m_tempDir.filePath(QStringLiteral("dalamud-assets.zip")), m_dalamudAssetDir.absolutePath())) {
qCritical(ASTRA_LOG) << "Failed to install Dalamud assets";
Q_EMIT launcher.dalamudError(i18n("Failed to install Dalamud assets."));
co_return false;
}
// TODO: check for file hashes
m_profile.setDalamudAssetVersion(m_remoteDalamudAssetVersion); m_profile.setDalamudAssetVersion(m_remoteDalamudAssetVersion);
Utility::writeVersion(m_dalamudAssetDir.absoluteFilePath(QStringLiteral("asset.ver")), QString::number(m_remoteDalamudAssetVersion)); Utility::writeVersion(m_dalamudAssetDir.absoluteFilePath(QStringLiteral("asset.ver")), QString::number(m_remoteDalamudAssetVersion));