From 2030b481bf1b708aa5ecc0d9c99b20f24ea59dac Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Wed, 4 Feb 2026 18:29:00 +0100 Subject: [PATCH] feat: cache news feed Signed-off-by: Sefa Eyeoglu --- launcher/Application.cpp | 1 + launcher/news/NewsChecker.cpp | 21 +++++++++++++-------- launcher/news/NewsChecker.h | 3 ++- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/launcher/Application.cpp b/launcher/Application.cpp index db883933a..50fd32d5b 100644 --- a/launcher/Application.cpp +++ b/launcher/Application.cpp @@ -1022,6 +1022,7 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) m_metacache->addBase("translations", QDir("translations").absolutePath()); m_metacache->addBase("meta", QDir("meta").absolutePath()); m_metacache->addBase("java", QDir("cache/java").absolutePath()); + m_metacache->addBase("feed", QDir("cache/feed").absolutePath()); m_metacache->Load(); qInfo() << "<> Cache initialized."; } diff --git a/launcher/news/NewsChecker.cpp b/launcher/news/NewsChecker.cpp index 72833c6d8..35173dd7b 100644 --- a/launcher/news/NewsChecker.cpp +++ b/launcher/news/NewsChecker.cpp @@ -39,6 +39,7 @@ #include #include +#include "Application.h" NewsChecker::NewsChecker(QNetworkAccessManager* network, const QString& feedUrl) { @@ -54,10 +55,12 @@ void NewsChecker::reloadNews() return; } + m_entry = APPLICATION->metacache()->resolveEntry("feed", "feed.xml"); + qDebug() << "Reloading news."; NetJob::Ptr job{ new NetJob("News RSS Feed", m_network) }; - job->addNetAction(Net::Download::makeByteArray(m_feedUrl, newsData.get())); + job->addNetAction(Net::Download::makeCached(m_feedUrl, m_entry)); job->setAskRetry(false); connect(job.get(), &NetJob::succeeded, this, &NewsChecker::rssDownloadFinished); connect(job.get(), &NetJob::failed, this, &NewsChecker::rssDownloadFailed); @@ -78,14 +81,16 @@ void NewsChecker::rssDownloadFinished() int errorLine = -1; int errorCol = -1; - // Parse the XML. - if (!doc.setContent(*newsData, false, &errorMsg, &errorLine, &errorCol)) { - QString fullErrorMsg = QString("Error parsing RSS feed XML. %1 at %2:%3.").arg(errorMsg).arg(errorLine).arg(errorCol); - fail(fullErrorMsg); - newsData->clear(); - return; + QFile feed(m_entry->getFullPath()); + + if (feed.open(QFile::ReadOnly | QFile::Text)) { + QTextStream in(&feed); + // Parse the XML. + if (!doc.setContent(in.readAll(), false, &errorMsg, &errorLine, &errorCol)) { + fail(QString("Error parsing RSS feed XML. %1 at %2:%3.").arg(errorMsg).arg(errorLine).arg(errorCol)); + return; + } } - newsData->clear(); } // If the parsing succeeded, read it. diff --git a/launcher/news/NewsChecker.h b/launcher/news/NewsChecker.h index 386bfd5ec..497ae2319 100644 --- a/launcher/news/NewsChecker.h +++ b/launcher/news/NewsChecker.h @@ -84,7 +84,8 @@ class NewsChecker : public QObject { //! True if news has been loaded. bool m_loadedNews; - std::unique_ptr newsData = std::make_unique(); + //! The cache entry for the feed. + MetaEntryPtr m_entry; /*! * Gets the error message that was given last time the news was loaded.