#pragma once #include "common/Aliases.hpp" #include "common/Atomic.hpp" #include "common/Channel.hpp" #include "common/UniqueAccess.hpp" #include "controllers/accounts/Account.hpp" #include "messages/Emote.hpp" #include "providers/twitch/TwitchUser.hpp" #include "util/QStringHash.hpp" #include #include #include #include #include #include #include namespace chatterino { enum FollowResult { FollowResult_Following, FollowResult_NotFollowing, FollowResult_Failed, }; struct TwitchEmoteSetResolverResponse { const QString channelName; const QString channelId; const QString type; const int tier; const bool isCustom; // Example response: // { // "channel_name": "zneix", // "channel_id": "99631238", // "type": "", // "tier": 1, // "custom": false // } TwitchEmoteSetResolverResponse(QJsonObject jsonObject) : channelName(jsonObject.value("channel_name").toString()) , channelId(jsonObject.value("channel_id").toString()) , type(jsonObject.value("type").toString()) , tier(jsonObject.value("tier").toInt()) , isCustom(jsonObject.value("custom").toBool()) { } }; std::vector getEmoteSetBatches(QStringList emoteSetKeys); class TwitchAccount : public Account { public: struct TwitchEmote { EmoteId id; EmoteName name; }; struct EmoteSet { QString key; QString channelName; QString text; bool local{false}; std::vector emotes; }; std::map staticEmoteSets; struct TwitchAccountEmoteData { std::vector> emoteSets; // this EmoteMap should contain all emotes available globally // excluding locally available emotes, such as follower ones EmoteMap emotes; }; TwitchAccount(const QString &username, const QString &oauthToken_, const QString &oauthClient_, const QString &_userID); virtual QString toString() const override; const QString &getUserName() const; const QString &getOAuthToken() const; const QString &getOAuthClient() const; const QString &getUserId() const; QColor color(); void setColor(QColor color); // Attempts to update the users OAuth Client ID // Returns true if the value has changed, otherwise false bool setOAuthClient(const QString &newClientID); // Attempts to update the users OAuth Token // Returns true if the value has changed, otherwise false bool setOAuthToken(const QString &newOAuthToken); bool isAnon() const; void loadBlocks(); void blockUser(QString userId, std::function onSuccess, std::function onFailure); void unblockUser(QString userId, std::function onSuccess, std::function onFailure); SharedAccessGuard> accessBlockedUserIds() const; SharedAccessGuard> accessBlocks() const; void loadEmotes(std::weak_ptr weakChannel = {}); // loadUserstateEmotes loads emote sets that are part of the USERSTATE emote-sets key // this function makes sure not to load emote sets that have already been loaded void loadUserstateEmotes(std::function callback); // setUserStateEmoteSets sets the emote sets that were parsed from the USERSTATE emote-sets key // Returns true if the newly inserted emote sets differ from the ones previously saved [[nodiscard]] bool setUserstateEmoteSets(QStringList newEmoteSets); SharedAccessGuard accessEmotes() const; SharedAccessGuard> accessLocalEmotes() const; // Automod actions void autoModAllow(const QString msgID, ChannelPtr channel); void autoModDeny(const QString msgID, ChannelPtr channel); private: void loadKrakenEmotes(); void loadEmoteSetData(std::shared_ptr emoteSet); QString oauthClient_; QString oauthToken_; QString userName_; QString userId_; const bool isAnon_; Atomic color_; mutable std::mutex ignoresMutex_; QStringList userstateEmoteSets_; UniqueAccess> ignores_; UniqueAccess> ignoresUserIds_; // std::map emotes; UniqueAccess emotes_; UniqueAccess> localEmotes_; }; } // namespace chatterino