219 lines
5.5 KiB
C++
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
|