TTW_Bot/twitcheventsub.h

219 lines
5.5 KiB
C++

#ifndef TWITCHEVENTSUB_H
#define TWITCHEVENTSUB_H
#include <QObject>
#include <QWebSocket>
#include <QNetworkAccessManager>
#include <QTimer>
#include <QJsonObject>
// Структуры данных событий (аналог Delphi-записей)
struct TCustomRewardEvent2
{
struct Subscription {
QString id;
QString type;
QString version;
QString status;
int cost;
QString created_at;
struct Condition {
QString broadcaster_user_id;
QString reward_id;
} condition;
struct Transport {
QString method;
} transport;
} subscription;
struct Event {
QString id;
QString broadcaster_user_id;
QString broadcaster_user_login;
QString broadcaster_user_name;
QString user_id;
QString user_login;
QString user_name;
QString user_input;
struct Reward {
QString id;
QString title;
int cost;
QString prompt;
} reward;
} event;
};
struct TFollowEvent
{
struct Subscription {
QString id;
QString type;
QString version;
QString status;
int cost;
QString created_at;
struct Condition {
QString broadcaster_user_id;
} condition;
struct Transport {
QString method;
} transport;
} subscription;
struct Event {
QString broadcaster_user_id;
QString broadcaster_user_login;
QString broadcaster_user_name;
QString user_id;
QString user_login;
QString user_name;
QString followed_at;
} event;
};
struct TSubEvent
{
struct Subscription {
QString id;
QString type;
QString version;
QString status;
int cost;
QString created_at;
struct Condition {
QString broadcaster_user_id;
} condition;
struct Transport {
QString method;
} transport;
} subscription;
struct Event {
QString broadcaster_user_id;
QString broadcaster_user_login;
QString broadcaster_user_name;
QString user_id;
QString user_login;
QString user_name;
QString tier;
bool is_gift;
} event;
};
struct TGiftEvent
{
struct Subscription {
QString id;
QString type;
QString version;
QString status;
int cost;
QString created_at;
struct Condition {
QString broadcaster_user_id;
} condition;
struct Transport {
QString method;
} transport;
} subscription;
struct Event {
QString broadcaster_user_id;
QString broadcaster_user_login;
QString broadcaster_user_name;
QString user_id;
QString user_login;
QString user_name;
int total;
QString tier;
int cumulative_total;
bool is_anonymous;
} event;
};
struct TRaidEvent
{
struct Subscription {
QString id;
QString type;
QString version;
QString status;
int cost;
QString created_at;
struct Condition {
QString to_broadcaster_user_id;
} condition;
struct Transport {
QString method;
} transport;
} subscription;
struct Event {
QString from_broadcaster_user_id;
QString from_broadcaster_user_login;
QString from_broadcaster_user_name;
QString to_broadcaster_user_id;
QString to_broadcaster_user_login;
QString to_broadcaster_user_name;
int viewers;
} event;
};
class TwitchEventSub : public QObject
{
Q_OBJECT
public:
explicit TwitchEventSub(QObject *parent = nullptr);
~TwitchEventSub();
void init(const QString &accessToken, const QString &clientId, const QString &broadcasterId);
void connectToTwitch();
void disconnectFromTwitch();
signals:
void onConnected();
void onDisconnected();
void onError(const QString &error);
void onLog(int level, const QString &method, const QString &message);
void onStatus(const QString &event, int code, const QString &description);
void onRawMessage(const QString &message);
void onCustomReward(const TCustomRewardEvent2 &data);
void onFollow(const TFollowEvent &data);
void onSubscribe(const TSubEvent &data);
void onGift(const TGiftEvent &data);
void onRaid(const TRaidEvent &data);
private slots:
void onWebSocketConnected();
void onWebSocketDisconnected();
void onWebSocketTextMessageReceived(const QString &message);
void onWebSocketError(QAbstractSocket::SocketError error);
void onPingTimer();
private:
bool subscribeTo(const QString &eventType, const QString &version, const QString &condition);
void performSubscriptions();
void parseMessage(const QString &message);
// Парсеры событий
TCustomRewardEvent2 parseCustomReward(const QJsonObject &payload);
TFollowEvent parseFollow(const QJsonObject &payload);
TSubEvent parseSubscribe(const QJsonObject &payload);
TGiftEvent parseGift(const QJsonObject &payload);
TRaidEvent parseRaid(const QJsonObject &payload);
QString m_accessToken;
QString m_clientId;
QString m_broadcasterId;
QString m_sessionId;
QWebSocket m_webSocket;
QNetworkAccessManager m_networkManager;
QTimer m_pingTimer;
bool m_connected;
};
#endif // TWITCHEVENTSUB_H