#ifndef TWITCHEVENTSUB_H #define TWITCHEVENTSUB_H #include #include #include #include #include // Структуры данных событий (аналог 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