diff --git a/src/resources.cpp b/src/resources.cpp index b8e1c7e5f..3cf41cb2e 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -60,6 +60,8 @@ Resources::Resources(EmoteManager &em, WindowManager &wm) this->dynamicBadgesLoaded = true; }); + + this->loadChatterinoBadges(); } Resources::BadgeVersion::BadgeVersion(QJsonObject &&root, EmoteManager &emoteManager, @@ -110,4 +112,36 @@ void Resources::loadChannelData(const std::string &roomID, bool bypassCache) }); } +void Resources::loadChatterinoBadges() +{ + this->chatterinoBadges.clear(); + + QString url = "https://fourtf.com/chatterino/badges.json"; + + util::urlFetchJSON(url, [this](QJsonObject &root) { + QJsonArray badgeVariants = root.value("badges").toArray(); + + for (QJsonArray::iterator it = badgeVariants.begin(); it != badgeVariants.end(); ++it) { + QJsonObject badgeVariant = it->toObject(); + const std::string badgeVariantTooltip = + badgeVariant.value("tooltip").toString().toStdString(); + const QString &badgeVariantImageURL = badgeVariant.value("image").toString(); + + auto badgeVariantPtr = std::make_shared( + badgeVariantTooltip, + new messages::LazyLoadedImage(this->emoteManager, this->windowManager, + badgeVariantImageURL)); + + QJsonArray badgeVariantUsers = badgeVariant.value("users").toArray(); + + for (QJsonArray::iterator it = badgeVariantUsers.begin(); it != badgeVariantUsers.end(); + ++it) { + const std::string username = it->toString().toStdString(); + this->chatterinoBadges[username] = + std::shared_ptr(badgeVariantPtr); + } + } + }); +} + } // namespace chatterino diff --git a/src/resources.hpp b/src/resources.hpp index a7608c4b1..852434128 100644 --- a/src/resources.hpp +++ b/src/resources.hpp @@ -3,6 +3,7 @@ #include "messages/lazyloadedimage.hpp" #include +#include #include namespace chatterino { @@ -71,7 +72,23 @@ public: // channelId std::map channels; + // Chatterino badges + struct ChatterinoBadge { + ChatterinoBadge(const std::string &_tooltip, messages::LazyLoadedImage *_image) + : tooltip(_tooltip) + , image(_image) + { + } + + std::string tooltip; + messages::LazyLoadedImage *image; + }; + + // username + std::map> chatterinoBadges; + void loadChannelData(const std::string &roomID, bool bypassCache = false); + void loadChatterinoBadges(); }; } // namespace chatterino diff --git a/src/twitch/twitchmessagebuilder.cpp b/src/twitch/twitchmessagebuilder.cpp index c5427bd47..dcbbbb6c3 100644 --- a/src/twitch/twitchmessagebuilder.cpp +++ b/src/twitch/twitchmessagebuilder.cpp @@ -52,6 +52,8 @@ SharedMessage TwitchMessageBuilder::parse() this->parseTwitchBadges(); + this->parseChatterinoBadges(); + if (this->args.includeChannelName) { this->parseChannelName(); } @@ -661,6 +663,20 @@ void TwitchMessageBuilder::parseTwitchBadges() } } +void TwitchMessageBuilder::parseChatterinoBadges() +{ + auto &badges = this->resources.chatterinoBadges; + auto it = badges.find(this->userName.toStdString()); + + if (it == badges.end()) { + return; + } + + const auto badge = it->second; + + this->appendWord(Word(badge->image, Word::BadgeChatterino, QString(), badge->tooltip.c_str())); +} + // bool // sortTwitchEmotes(const std::pair &a, // const std::pair &b) diff --git a/src/twitch/twitchmessagebuilder.hpp b/src/twitch/twitchmessagebuilder.hpp index d1b49051c..9b21f93e5 100644 --- a/src/twitch/twitchmessagebuilder.hpp +++ b/src/twitch/twitchmessagebuilder.hpp @@ -70,6 +70,7 @@ private: bool appendEmote(EmoteData &emoteData); void parseTwitchBadges(); + void parseChatterinoBadges(); }; } // namespace twitch