#ifndef TWITCHCLIENT_H #define TWITCHCLIENT_H #include #include #include #include #include class TwitchClient : public QObject { Q_OBJECT public: explicit TwitchClient(QObject *parent = nullptr); ~TwitchClient(); // Основные методы void connectToTwitch(const QString &oauthToken, const QString &nickname, const QString &channel); void sendMessage(const QString &message); void disconnect(); bool isConnected() const; signals: void newMessage(const QString &sender, const QString &channel, const QString &message); void systemMessage(const QString &message); void connected(); void disconnected(); void error(const QString &errorMessage); private slots: void onConnected(); void onReadyRead(); void onSslErrors(const QList &errors); void onSocketError(QAbstractSocket::SocketError error); void onDisconnected(); void sendQueuedData(); void sendPing(); private: // WebSocket методы void sendWebSocketFrame(const QByteArray &data, quint8 opcode = 0x01); QByteArray createWebSocketFrame(const QByteArray &data, quint8 opcode); void processWebSocketFrame(const QByteArray &frame); // IRC методы void sendIrcCommand(const QString &command, const QString ¶ms = ""); void parseIrcMessage(const QString &message); // Вспомогательные методы QByteArray generateWebSocketKey(); QByteArray base64Encode(const QByteArray &data); QByteArray sha1Hash(const QByteArray &data); private: QSslSocket *m_socket; QTimer *m_writeTimer; QTimer *m_pingTimer; QQueue m_writeQueue; QString m_nickname; QString m_channel; QString m_oauthToken; bool m_webSocketHandshakeDone; bool m_ircAuthenticated; bool m_channelJoined; QByteArray m_receiveBuffer; }; #endif // TWITCHCLIENT_H