diff --git a/src/resources.cpp b/src/resources.cpp index 081518487..cedf51929 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -38,28 +38,7 @@ Resources::Resources(EmoteManager &em, WindowManager &wm) , buttonBan(lli(em, wm, ":/images/button_ban.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"); - - 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->loadDynamicTwitchBadges(); this->loadChatterinoBadges(); } @@ -83,12 +62,13 @@ void Resources::loadChannelData(const std::string &roomID, bool bypassCache) { qDebug() << "Load channel data for" << QString::fromStdString(roomID); - // Step 1: Get - QString url = "https://badges.twitch.tv/v1/badges/channels/" + QString::fromStdString(roomID) + "/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(); 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() { 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(); qDebug() << "chatbadges fetched"; for (QJsonArray::iterator it = badgeVariants.begin(); it != badgeVariants.end(); ++it) { diff --git a/src/resources.hpp b/src/resources.hpp index 852434128..992110854 100644 --- a/src/resources.hpp +++ b/src/resources.hpp @@ -88,6 +88,7 @@ public: std::map> chatterinoBadges; void loadChannelData(const std::string &roomID, bool bypassCache = false); + void loadDynamicTwitchBadges(); void loadChatterinoBadges(); }; diff --git a/src/util/networkmanager.hpp b/src/util/networkmanager.hpp index 2c06afc61..f3deeeb69 100644 --- a/src/util/networkmanager.hpp +++ b/src/util/networkmanager.hpp @@ -1,19 +1,31 @@ #pragma once +#include +#include #include +#include #include #include namespace chatterino { - -namespace messages { - -class LazyLoadedImage; - -} // namespace messages - 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 { struct Data { @@ -96,6 +108,15 @@ public: emit requester.requestUrl(); } + + template + void getJSON(FinishedCallback onFinished) + { + this->get([onFinished{std::move(onFinished)}](auto reply) { + auto object = parseJSONFromReplyxD(reply); + onFinished(object); + }); + } }; class NetworkWorker : public QObject diff --git a/src/util/urlfetch.hpp b/src/util/urlfetch.hpp index b8ae44a3c..15131ff91 100644 --- a/src/util/urlfetch.hpp +++ b/src/util/urlfetch.hpp @@ -38,17 +38,6 @@ static QJsonObject parseJSONFromReply(QNetworkReply *reply) return jsonDoc.object(); } -static void urlFetchJSON(const QString &url, const QObject *caller, - std::function 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, std::function successCallback, int timeoutMs) {