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

Add a headline parser

This commit is contained in:
Joshua Goins 2022-03-10 09:19:52 -05:00
parent 1c71d69a84
commit 44869aa5de
3 changed files with 102 additions and 1 deletions

View file

@ -34,7 +34,9 @@ set(SRC
src/gamescopesettingswindow.cpp
include/gamescopesettingswindow.h
src/fiinparser.cpp
include/fiinparser.h)
include/fiinparser.h
include/headline.h
src/headline.cpp)
include(FetchContent)

29
include/headline.h Normal file
View file

@ -0,0 +1,29 @@
#pragma once
#include <QUrl>
#include <QDateTime>
struct News {
QDateTime date;
QString id;
QString tag;
QString title;
QUrl url;
};
struct Banner {
QUrl link;
QUrl bannerImage;
};
struct Headline {
QList<Banner> banner;
QList<News> news;
QList<News> pinned;
};
class LauncherCore;
void getHeadline(LauncherCore& core, std::function<void(Headline)> return_func);

70
src/headline.cpp Normal file
View file

@ -0,0 +1,70 @@
#include "headline.h"
#include <QUrlQuery>
#include <QNetworkRequest>
#include <QDateTime>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include "launchercore.h"
void getHeadline(LauncherCore& core, std::function<void(Headline)> return_func) {
QUrlQuery query;
query.addQueryItem("lang", "en-us");
query.addQueryItem("media", "pcapp");
QUrl url;
url.setScheme("https");
url.setHost("frontier.ffxiv.com");
url.setPath("/news/headline.json");
url.setQuery(query);
auto request = QNetworkRequest(QString("%1&%2").arg(url.toString(), QString::number(QDateTime::currentMSecsSinceEpoch())));
core.buildRequest(request);
qInfo() << request.url();
request.setRawHeader("Accept", "application/json, text/plain, */*");
request.setRawHeader("Origin", "https://launcher.finalfantasyxiv.com");
request.setRawHeader("Referer", QString("https://launcher.finalfantasyxiv.com/v600/index.html?rc_lang=%1&time=%2").arg("en-us", QDateTime::currentDateTimeUtc().toString("yyyy-MM-dd-HH")).toUtf8());
auto reply = core.mgr->get(request);
core.connect(reply, &QNetworkReply::finished, [=] {
auto document = QJsonDocument::fromJson(reply->readAll());
Headline headline;
const auto parseNews = [](QJsonObject object) -> News {
News news;
news.date = QDateTime::fromString(object["date"].toString());
news.id = object["id"].toString();
news.tag = object["tag"].toString();
news.title = object["title"].toString();
news.url = QUrl(object["url"].toString());
return news;
};
for(auto bannerObject : document.object()["banner"].toArray()) {
Banner banner;
banner.link = QUrl(bannerObject.toObject()["link"].toString());
banner.bannerImage = QUrl(bannerObject.toObject()["lsb_banner"].toString());
headline.banner.push_back(banner);
}
for(auto newsObject : document.object()["news"].toArray()) {
auto news = parseNews(newsObject.toObject());
headline.news.push_back(news);
}
for(auto pinnedObject : document.object()["news"].toArray()) {
auto pinned = parseNews(pinnedObject.toObject());
headline.pinned.push_back(pinned);
}
return_func(headline);
});
}