#pragma once #define GIF_FRAME_LENGTH 33 #include "emojis.hpp" #include "messages/image.hpp" #include "providers/twitch/emotevalue.hpp" #include "providers/twitch/twitchaccount.hpp" #include "signalvector.hpp" #include "util/concurrentmap.hpp" #include "util/emotemap.hpp" #include #include #include #include #include #include namespace chatterino { namespace singletons { class EmoteManager { public: EmoteManager(); ~EmoteManager() = delete; void initialize(); void reloadBTTVChannelEmotes(const QString &channelName, std::weak_ptr channelEmoteMap); void reloadFFZChannelEmotes(const QString &channelName, std::weak_ptr channelEmoteMap); util::ConcurrentMap &getTwitchEmotes(); util::EmoteMap &getFFZEmotes(); util::EmoteMap &getChatterinoEmotes(); util::EmoteMap &getBTTVChannelEmoteFromCaches(); util::EmojiMap &getEmojis(); util::ConcurrentMap &getFFZChannelEmoteFromCaches(); util::ConcurrentMap &getTwitchEmoteFromCache(); util::EmoteData getCheerImage(long long int amount, bool animated); util::EmoteData getTwitchEmoteById(long int id, const QString &emoteName); int getGeneration() { return _generation; } void incGeneration() { _generation++; } pajlada::Signals::NoArgSignal &getGifUpdateSignal(); // Bit badge/emotes? util::ConcurrentMap miscImageCache; private: /// Emojis QRegularExpression findShortCodesRegex; // shortCodeToEmoji maps strings like "sunglasses" to its emoji QMap emojiShortCodeToEmoji; // Maps the first character of the emoji unicode string to a vector of possible emojis QMap> emojiFirstByte; util::EmojiMap emojis; void loadEmojis(); public: void parseEmojis(std::vector> &parsedWords, const QString &text); QString replaceShortCodes(const QString &text); std::vector emojiShortCodes; /// Twitch emotes void refreshTwitchEmotes(const std::shared_ptr &user); struct TwitchAccountEmoteData { struct TwitchEmote { std::string id; std::string code; }; // emote set std::map> emoteSets; std::vector emoteCodes; util::EmoteMap emotes; bool filled = false; }; std::map twitchAccountEmotes; private: // emote code util::ConcurrentMap _twitchEmotes; // emote id util::ConcurrentMap _twitchEmoteFromCache; /// BTTV emotes util::EmoteMap bttvChannelEmotes; public: util::ConcurrentMap bttvChannels; util::EmoteMap bttvGlobalEmotes; SignalVector bttvGlobalEmoteCodes; // roomID std::map> bttvChannelEmoteCodes; util::EmoteMap _bttvChannelEmoteFromCaches; private: void loadBTTVEmotes(); /// FFZ emotes util::EmoteMap ffzChannelEmotes; public: util::ConcurrentMap ffzChannels; util::EmoteMap ffzGlobalEmotes; SignalVector ffzGlobalEmoteCodes; std::map> ffzChannelEmoteCodes; private: util::ConcurrentMap _ffzChannelEmoteFromCaches; void loadFFZEmotes(); /// Chatterino emotes util::EmoteMap _chatterinoEmotes; pajlada::Signals::NoArgSignal gifUpdateTimerSignal; QTimer gifUpdateTimer; bool gifUpdateTimerInitiated = false; int _generation = 0; }; } // namespace singletons } // namespace chatterino