#pragma once #include "common/Aliases.hpp" #include "common/Atomic.hpp" #include #include namespace chatterino { struct Emote; using EmotePtr = std::shared_ptr; class EmoteMap; class Channel; struct BttvLiveUpdateEmoteUpdateAddMessage; struct BttvLiveUpdateEmoteRemoveMessage; class BttvEmotes final { static constexpr const char *globalEmoteApiUrl = "https://api.betterttv.net/3/cached/emotes/global"; static constexpr const char *bttvChannelEmoteApiUrl = "https://api.betterttv.net/3/cached/users/twitch/"; public: BttvEmotes(); std::shared_ptr emotes() const; boost::optional emote(const EmoteName &name) const; void loadEmotes(); void setEmotes(std::shared_ptr emotes); static void loadChannel(std::weak_ptr channel, const QString &channelId, const QString &channelDisplayName, std::function callback, bool manualRefresh); /** * Adds an emote to the `channelEmoteMap`. * This will _copy_ the emote map and * update the `Atomic`. * * @return The added emote. */ static EmotePtr addEmote( const QString &channelDisplayName, Atomic> &channelEmoteMap, const BttvLiveUpdateEmoteUpdateAddMessage &message); /** * Updates an emote in this `channelEmoteMap`. * This will _copy_ the emote map and * update the `Atomic`. * * @return pair if any emote was updated. */ static boost::optional> updateEmote( const QString &channelDisplayName, Atomic> &channelEmoteMap, const BttvLiveUpdateEmoteUpdateAddMessage &message); /** * Removes an emote from this `channelEmoteMap`. * This will _copy_ the emote map and * update the `Atomic`. * * @return The removed emote if any emote was removed. */ static boost::optional removeEmote( Atomic> &channelEmoteMap, const BttvLiveUpdateEmoteRemoveMessage &message); private: Atomic> global_; }; } // namespace chatterino