diff --git a/CMakeLists.txt b/CMakeLists.txt index b2e6661..ce6b471 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,9 @@ find_package(Qt6 ${QT_MIN_VERSION} REQUIRED COMPONENTS WebView) find_package(KF6 ${KF_MIN_VERSION} REQUIRED COMPONENTS Kirigami2 I18n Config CoreAddons) find_package(PkgConfig REQUIRED) +find_package(QCoro6 REQUIRED COMPONENTS Core Network Qml) +qcoro_enable_coroutines() + qt_policy(SET QTP0001 NEW) if (ENABLE_WATCHDOG) diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt index b87af91..325a60d 100644 --- a/launcher/CMakeLists.txt +++ b/launcher/CMakeLists.txt @@ -86,7 +86,10 @@ target_link_libraries(astra PRIVATE KF6::I18n KF6::ConfigCore KF6::ConfigGui - KF6::CoreAddons) + KF6::CoreAddons + QCoro::Core + QCoro::Network + QCoro::Qml) if (ENABLE_WATCHDOG) target_sources(astra PRIVATE diff --git a/launcher/include/launchercore.h b/launcher/include/launchercore.h index 027138c..19f8186 100755 --- a/launcher/include/launchercore.h +++ b/launcher/include/launchercore.h @@ -7,6 +7,7 @@ #include #include #include +#include #include "accountmanager.h" #include "headline.h" @@ -208,6 +209,8 @@ private: bool checkIfInPath(const QString &program); + QCoro::Task<> fetchNews(); + SteamAPI *steamApi = nullptr; bool m_loadingFinished = false; diff --git a/launcher/src/launchercore.cpp b/launcher/src/launchercore.cpp index 56da83a..0760e63 100755 --- a/launcher/src/launchercore.cpp +++ b/launcher/src/launchercore.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #ifdef ENABLE_GAMEMODE @@ -574,6 +575,11 @@ void LauncherCore::setSquareEnixLoginServer(const QString &value) } void LauncherCore::refreshNews() +{ + fetchNews(); +} + +QCoro::Task<> LauncherCore::fetchNews() { QUrlQuery query; query.addQueryItem("lang", "en-us"); @@ -594,56 +600,56 @@ void LauncherCore::refreshNews() .toUtf8()); auto reply = mgr->get(request); - QObject::connect(reply, &QNetworkReply::finished, [this, reply] { - auto document = QJsonDocument::fromJson(reply->readAll()); + co_await reply; - auto headline = new Headline(this); - if (document.isEmpty()) { - headline->failedToLoad = true; + auto document = QJsonDocument::fromJson(reply->readAll()); + + auto headline = new Headline(this); + if (document.isEmpty()) { + headline->failedToLoad = true; + } + + const auto parseNews = [](QJsonObject object) -> News { + News news; + news.date = QDateTime::fromString(object["date"].toString(), Qt::DateFormat::ISODate); + news.id = object["id"].toString(); + news.tag = object["tag"].toString(); + news.title = object["title"].toString(); + + if (object["url"].toString().isEmpty()) { + news.url = QUrl(QString("https://na.finalfantasyxiv.com/lodestone/news/detail/%1").arg(news.id)); + } else { + news.url = QUrl(object["url"].toString()); } - const auto parseNews = [](QJsonObject object) -> News { - News news; - news.date = QDateTime::fromString(object["date"].toString(), Qt::DateFormat::ISODate); - news.id = object["id"].toString(); - news.tag = object["tag"].toString(); - news.title = object["title"].toString(); + return news; + }; - if (object["url"].toString().isEmpty()) { - news.url = QUrl(QString("https://na.finalfantasyxiv.com/lodestone/news/detail/%1").arg(news.id)); - } else { - news.url = QUrl(object["url"].toString()); - } + for (auto bannerObject : document.object()["banner"].toArray()) { + auto banner = Banner(); + banner.link = QUrl(bannerObject.toObject()["link"].toString()); + banner.bannerImage = QUrl(bannerObject.toObject()["lsb_banner"].toString()); - return news; - }; + headline->banners.push_back(banner); + } - for (auto bannerObject : document.object()["banner"].toArray()) { - auto banner = Banner(); - banner.link = QUrl(bannerObject.toObject()["link"].toString()); - banner.bannerImage = QUrl(bannerObject.toObject()["lsb_banner"].toString()); + for (auto newsObject : document.object()["news"].toArray()) { + auto news = parseNews(newsObject.toObject()); + headline->news.push_back(news); + } - headline->banners.push_back(banner); - } + for (auto pinnedObject : document.object()["pinned"].toArray()) { + auto pinned = parseNews(pinnedObject.toObject()); + headline->pinned.push_back(pinned); + } - for (auto newsObject : document.object()["news"].toArray()) { - auto news = parseNews(newsObject.toObject()); - headline->news.push_back(news); - } + for (auto pinnedObject : document.object()["topics"].toArray()) { + auto pinned = parseNews(pinnedObject.toObject()); + headline->topics.push_back(pinned); + } - for (auto pinnedObject : document.object()["pinned"].toArray()) { - auto pinned = parseNews(pinnedObject.toObject()); - headline->pinned.push_back(pinned); - } - - for (auto pinnedObject : document.object()["topics"].toArray()) { - auto pinned = parseNews(pinnedObject.toObject()); - headline->topics.push_back(pinned); - } - - m_headline = headline; - Q_EMIT newsChanged(); - }); + m_headline = headline; + Q_EMIT newsChanged(); } Headline *LauncherCore::headline() diff --git a/launcher/src/main.cpp b/launcher/src/main.cpp index 2304ab3..d33a7ac 100755 --- a/launcher/src/main.cpp +++ b/launcher/src/main.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include "astra-version.h" #include "compatibilitytoolinstaller.h" @@ -76,6 +77,8 @@ int main(int argc, char *argv[]) } #endif + QCoro::Qml::registerTypes(); + QQmlApplicationEngine engine; auto core = engine.singletonInstance(QStringLiteral("zone.xiv.astra"), QStringLiteral("LauncherCore"));