TTW_Bot/emoteprovider.h

116 lines
3.3 KiB
C++

// emoteprovider.h
#ifndef EMOTEPROVIDER_H
#define EMOTEPROVIDER_H
#include <QObject>
#include <QList>
#include <QString>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <functional>
enum LogLevelemt {
LOG_INFO = 0,
LOG_WARNING = 1,
LOG_ERROR = 2,
LOG_DEBUG = 3
};
using LogCallback = std::function<void(const QString& module,
const QString& method,
const QString& message,
LogLevelemt level)>;
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<BTTVEmote> 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<SevenTVEmote> m_emotes;
QString m_lastUserId;
};
#endif // EMOTEPROVIDER_H