75 lines
2.0 KiB
C++
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 ¶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<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
|