TTW_Bot/twitchclient.h

75 lines
2.0 KiB
C++

#ifndef TWITCHCLIENT_H
#define TWITCHCLIENT_H
#include <QObject>
#include <QSslSocket>
#include <QTimer>
#include <QByteArray>
#include <QQueue>
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<QSslError> &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 &params = "");
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<QByteArray> 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