116 lines
3.3 KiB
C++
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
|