Remove urlFetchJSON usages. They now use NetworkRequest.getJSON

This commit is contained in:
Rasmus Karlsson 2017-10-27 21:22:06 +02:00
parent 75079d5ac8
commit 41ec892bf8
4 changed files with 67 additions and 45 deletions

View file

@ -38,28 +38,7 @@ Resources::Resources(EmoteManager &em, WindowManager &wm)
, buttonBan(lli(em, wm, ":/images/button_ban.png", 0.25)) , buttonBan(lli(em, wm, ":/images/button_ban.png", 0.25))
, buttonTimeout(lli(em, wm, ":/images/button_timeout.png", 0.25)) , buttonTimeout(lli(em, wm, ":/images/button_timeout.png", 0.25))
{ {
QString badgesUrl("https://badges.twitch.tv/v1/badges/global/display?language=en"); this->loadDynamicTwitchBadges();
util::urlFetchJSON(badgesUrl, QThread::currentThread(), [this](QJsonObject &root) {
QJsonObject sets = root.value("badge_sets").toObject();
qDebug() << "badges fetched";
for (QJsonObject::iterator it = sets.begin(); it != sets.end(); ++it) {
QJsonObject versions = it.value().toObject().value("versions").toObject();
auto &badgeSet = this->badgeSets[it.key().toStdString()];
auto &versionsMap = badgeSet.versions;
for (auto versionIt = std::begin(versions); versionIt != std::end(versions);
++versionIt) {
std::string kkey = versionIt.key().toStdString();
QJsonObject versionObj = versionIt.value().toObject();
BadgeVersion v(std::move(versionObj), this->emoteManager, this->windowManager);
versionsMap.emplace(kkey, v);
}
}
this->dynamicBadgesLoaded = true;
});
this->loadChatterinoBadges(); this->loadChatterinoBadges();
} }
@ -83,12 +62,13 @@ void Resources::loadChannelData(const std::string &roomID, bool bypassCache)
{ {
qDebug() << "Load channel data for" << QString::fromStdString(roomID); qDebug() << "Load channel data for" << QString::fromStdString(roomID);
// Step 1: Get
QString url = "https://badges.twitch.tv/v1/badges/channels/" + QString::fromStdString(roomID) + QString url = "https://badges.twitch.tv/v1/badges/channels/" + QString::fromStdString(roomID) +
"/display?language=en"; "/display?language=en";
util::urlFetchJSON(url, QThread::currentThread(), [this, roomID](QJsonObject &root) { util::NetworkRequest req(url);
req.setCaller(QThread::currentThread());
req.getJSON([this, roomID](QJsonObject &root) {
QJsonObject sets = root.value("badge_sets").toObject(); QJsonObject sets = root.value("badge_sets").toObject();
Resources::Channel &ch = this->channels[roomID]; Resources::Channel &ch = this->channels[roomID];
@ -112,13 +92,44 @@ void Resources::loadChannelData(const std::string &roomID, bool bypassCache)
}); });
} }
void Resources::loadDynamicTwitchBadges()
{
static QString url("https://badges.twitch.tv/v1/badges/global/display?language=en");
util::NetworkRequest req(url);
req.setCaller(QThread::currentThread());
req.getJSON([this](QJsonObject &root) {
QJsonObject sets = root.value("badge_sets").toObject();
qDebug() << "badges fetched";
for (QJsonObject::iterator it = sets.begin(); it != sets.end(); ++it) {
QJsonObject versions = it.value().toObject().value("versions").toObject();
auto &badgeSet = this->badgeSets[it.key().toStdString()];
auto &versionsMap = badgeSet.versions;
for (auto versionIt = std::begin(versions); versionIt != std::end(versions);
++versionIt) {
std::string kkey = versionIt.key().toStdString();
QJsonObject versionObj = versionIt.value().toObject();
BadgeVersion v(std::move(versionObj), this->emoteManager, this->windowManager);
versionsMap.emplace(kkey, v);
}
}
this->dynamicBadgesLoaded = true;
});
}
void Resources::loadChatterinoBadges() void Resources::loadChatterinoBadges()
{ {
this->chatterinoBadges.clear(); this->chatterinoBadges.clear();
QString url = "https://fourtf.com/chatterino/badges.json"; static QString url("https://fourtf.com/chatterino/badges.json");
util::urlFetchJSON(url, QThread::currentThread(), [this](QJsonObject &root) { util::NetworkRequest req(url);
req.setCaller(QThread::currentThread());
req.getJSON([this](QJsonObject &root) {
QJsonArray badgeVariants = root.value("badges").toArray(); QJsonArray badgeVariants = root.value("badges").toArray();
qDebug() << "chatbadges fetched"; qDebug() << "chatbadges fetched";
for (QJsonArray::iterator it = badgeVariants.begin(); it != badgeVariants.end(); ++it) { for (QJsonArray::iterator it = badgeVariants.begin(); it != badgeVariants.end(); ++it) {

View file

@ -88,6 +88,7 @@ public:
std::map<std::string, std::shared_ptr<ChatterinoBadge>> chatterinoBadges; std::map<std::string, std::shared_ptr<ChatterinoBadge>> chatterinoBadges;
void loadChannelData(const std::string &roomID, bool bypassCache = false); void loadChannelData(const std::string &roomID, bool bypassCache = false);
void loadDynamicTwitchBadges();
void loadChatterinoBadges(); void loadChatterinoBadges();
}; };

View file

@ -1,19 +1,31 @@
#pragma once #pragma once
#include <QJsonDocument>
#include <QJsonObject>
#include <QNetworkAccessManager> #include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QThread> #include <QThread>
#include <QUrl> #include <QUrl>
namespace chatterino { namespace chatterino {
namespace messages {
class LazyLoadedImage;
} // namespace messages
namespace util { namespace util {
static QJsonObject parseJSONFromReplyxD(QNetworkReply *reply)
{
if (reply->error() != QNetworkReply::NetworkError::NoError) {
return QJsonObject();
}
QByteArray data = reply->readAll();
QJsonDocument jsonDoc(QJsonDocument::fromJson(data));
if (jsonDoc.isNull()) {
return QJsonObject();
}
return jsonDoc.object();
}
class NetworkRequest class NetworkRequest
{ {
struct Data { struct Data {
@ -96,6 +108,15 @@ public:
emit requester.requestUrl(); emit requester.requestUrl();
} }
template <typename FinishedCallback>
void getJSON(FinishedCallback onFinished)
{
this->get([onFinished{std::move(onFinished)}](auto reply) {
auto object = parseJSONFromReplyxD(reply);
onFinished(object);
});
}
}; };
class NetworkWorker : public QObject class NetworkWorker : public QObject

View file

@ -38,17 +38,6 @@ static QJsonObject parseJSONFromReply(QNetworkReply *reply)
return jsonDoc.object(); return jsonDoc.object();
} }
static void urlFetchJSON(const QString &url, const QObject *caller,
std::function<void(QJsonObject &)> successCallback)
{
util::NetworkRequest req(url);
req.setCaller(caller);
req.get([=](QNetworkReply *reply) {
auto node = parseJSONFromReply(reply);
successCallback(node);
});
}
static void urlFetchTimeout(const QString &url, const QObject *caller, static void urlFetchTimeout(const QString &url, const QObject *caller,
std::function<void(QNetworkReply *)> successCallback, int timeoutMs) std::function<void(QNetworkReply *)> successCallback, int timeoutMs)
{ {