From bcf846d3874b90391ddfaba7412fdecbc58d1656 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Fri, 4 Aug 2023 17:34:53 -0400 Subject: [PATCH] Cache lodestone avatars so we stop hammering xivapi --- launcher/src/account.cpp | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/launcher/src/account.cpp b/launcher/src/account.cpp index 3cd69cc..910dfaa 100644 --- a/launcher/src/account.cpp +++ b/launcher/src/account.cpp @@ -181,15 +181,36 @@ void Account::fetchAvatar() return; } - QNetworkRequest request(QStringLiteral("https://xivapi.com/character/%1").arg(lodestoneId())); - auto reply = m_launcher.mgr->get(request); - connect(reply, &QNetworkReply::finished, [this, reply] { - auto document = QJsonDocument::fromJson(reply->readAll()); - if (document.isObject()) { - m_url = document.object()["Character"].toObject()["Avatar"].toString(); - Q_EMIT avatarUrlChanged(); - } - }); + const auto cacheLocation = QStandardPaths::standardLocations(QStandardPaths::CacheLocation)[0] + "/avatars"; + if (!QDir().exists(cacheLocation)) { + QDir().mkpath(cacheLocation); + } + + const QString filename(QStringLiteral("%1/%2.jpg").arg(cacheLocation, lodestoneId())); + if (!QFile(filename).exists()) { + qDebug() << "Did not find lodestone character " << lodestoneId() << " in cache, fetching from xivapi."; + QNetworkRequest request(QStringLiteral("https://xivapi.com/character/%1").arg(lodestoneId())); + auto reply = m_launcher.mgr->get(request); + connect(reply, &QNetworkReply::finished, [this, filename, reply] { + auto document = QJsonDocument::fromJson(reply->readAll()); + if (document.isObject()) { + QNetworkRequest avatarRequest(document.object()["Character"].toObject()["Avatar"].toString()); + auto avatarReply = m_launcher.mgr->get(avatarRequest); + QObject::connect(avatarReply, &QNetworkReply::finished, [this, filename, avatarReply] { + QFile file(filename); + file.open(QIODevice::ReadWrite); + file.write(avatarReply->readAll()); + file.close(); + + m_url = QStringLiteral("file:///%1").arg(filename); + Q_EMIT avatarUrlChanged(); + }); + } + }); + } else { + m_url = QStringLiteral("file:///%1").arg(filename); + Q_EMIT avatarUrlChanged(); + } } void Account::setKeychainValue(const QString &key, const QString &value)