// emoteprovider.h #ifndef EMOTEPROVIDER_H #define EMOTEPROVIDER_H #include #include #include #include #include #include enum LogLevelemt { LOG_INFO = 0, LOG_WARNING = 1, LOG_ERROR = 2, LOG_DEBUG = 3 }; using LogCallback = std::function; struct BTTVEmote { QString id; QString code; QString url() const { return QString("https://cdn.betterttv.net/emote/%1/1x").arg(id); } }; struct SevenTVEmote { QString id; QString code; QString url; }; // Абстрактный базовый класс для провайдеров эмодзи class EmoteProvider : public QObject { Q_OBJECT public: explicit EmoteProvider(QObject *parent = nullptr); virtual ~EmoteProvider(); void setLogCallback(LogCallback callback); virtual void fetchGlobal() = 0; virtual void fetchCustom(const QString &userId) = 0; virtual QString getEmoteUrl(const QString &emoteName) = 0; virtual QString cleanMessage(const QString& message) const = 0; signals: void emotesLoaded(); protected: void log(const QString &method, const QString &message, LogLevelemt level); virtual QString getBaseUrl() const = 0; virtual void parseGlobalResponse(const QByteArray &data) = 0; virtual void parseCustomResponse(const QByteArray &data, const QString &userId) = 0; QNetworkAccessManager *m_networkManager; LogCallback m_logCallback; }; // Провайдер для BetterTTV class BTTVProvider : public EmoteProvider { Q_OBJECT public: explicit BTTVProvider(QObject *parent = nullptr); ~BTTVProvider(); void fetchGlobal() override; void fetchCustom(const QString &userId) override; QString getEmoteUrl(const QString &emoteName) override; QString cleanMessage(const QString& message) const override; private slots: void onGlobalReplyFinished(QNetworkReply *reply); void onCustomReplyFinished(QNetworkReply *reply); private: QString getBaseUrl() const override { return "https://api.betterttv.net/3/cached/"; } void parseGlobalResponse(const QByteArray &data) override; void parseCustomResponse(const QByteArray &data, const QString &userId) override; QList m_emotes; QString m_lastUserId; }; // Провайдер для 7TV class SevenTVProvider : public EmoteProvider { Q_OBJECT public: explicit SevenTVProvider(QObject *parent = nullptr); ~SevenTVProvider(); void fetchGlobal() override; void fetchCustom(const QString &userId) override; QString getEmoteUrl(const QString &emoteName) override; QString cleanMessage(const QString& message) const override; private slots: void onGlobalReplyFinished(QNetworkReply *reply); void onCustomReplyFinished(QNetworkReply *reply); private: QString getBaseUrl() const override { return "https://api.7tv.app/v3/"; } void parseGlobalResponse(const QByteArray &data) override; void parseCustomResponse(const QByteArray &data, const QString &userId) override; QList m_emotes; QString m_lastUserId; }; #endif // EMOTEPROVIDER_H