#pragma once #define GIF_FRAME_LENGTH 33 #include "emojis.hpp" #include "messages/image.hpp" #include "providers/bttv/bttvemotes.hpp" #include "providers/twitch/twitchemotes.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; providers::twitch::TwitchEmotes twitch; providers::bttv::BTTVEmotes bttv; void initialize(); void reloadFFZChannelEmotes(const QString &channelName, std::weak_ptr channelEmoteMap); util::EmoteMap &getFFZEmotes(); util::EmoteMap &getChatterinoEmotes(); util::EmojiMap &getEmojis(); util::ConcurrentMap &getFFZChannelEmoteFromCaches(); util::EmoteData getCheerImage(long long int amount, bool animated); 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; /// 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; }; } // namespace singletons } // namespace chatterino