mirror of https://notabug.org/acetone/ircabot.git
85 lines
2.7 KiB
C++
85 lines
2.7 KiB
C++
#ifndef IRCCLIENT_H
|
|
#define IRCCLIENT_H
|
|
|
|
#include "connectiondata.h"
|
|
|
|
#include <QRegularExpression>
|
|
#include <QSharedPointer>
|
|
#include <QTcpSocket>
|
|
#include <QThread>
|
|
#include <QTimer>
|
|
#include <map>
|
|
|
|
class IrcClient : public QObject
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
IrcClient(const ConnectionData& config, QObject *parent = nullptr);
|
|
~IrcClient();
|
|
QStringList getOnlineUsers(const QString& channel);
|
|
void connectToServer();
|
|
|
|
private:
|
|
enum class IrcCode {
|
|
Failed = -1,
|
|
ChannelTopic = 332,
|
|
NamesList = 353,
|
|
EndOfNamesList = 366,
|
|
NickNameIsAlreadyInUse = 433
|
|
};
|
|
|
|
void write(const QString& message, bool log = true);
|
|
void process(const QString& message);
|
|
IrcCode getServerCode(const QString& message);
|
|
QString getChannelName(const QString& message);
|
|
QString getNickname(const QString& message);
|
|
void toTrigger(const QString& channel, const QString& nickname, const QString& message);
|
|
void toChatLog(QString channel, const QString& nick, const QString& message);
|
|
void consoleLog(const QString& message);
|
|
void errorLog(const QString& message);
|
|
|
|
QTcpSocket* m_socket;
|
|
ConnectionData m_connectionData;
|
|
QTimer m_timerToJoin;
|
|
QTimer m_nickRecover;
|
|
QTimer m_usersActualize; // to get all users status (op, owner, etc)
|
|
QTimer m_pingTimeout;
|
|
QTimer m_stopWriting; // for output messages flow control (one in second as maximum)
|
|
|
|
const QRegularExpression m_rgxPrivmsg {"^[^\\s]*\\sPRIVMSG"};
|
|
const QRegularExpression m_rgxJoin {"^[^\\s]*\\sJOIN"};
|
|
const QRegularExpression m_rgxPart {"^[^\\s]*\\sPART"};
|
|
const QRegularExpression m_rgxNick {"^[^\\s]*\\sNICK"};
|
|
const QRegularExpression m_rgxMode {"^[^\\s]*\\sMODE"};
|
|
const QRegularExpression m_rgxKick {"^[^\\s]*\\sKICK"};
|
|
const QRegularExpression m_rgxQuit {"^[^\\s]*\\sQUIT"};
|
|
const QRegularExpression m_rgxTopic {"^[^\\s]*\\sTOPIC"};
|
|
|
|
bool m_reconnectReport;
|
|
bool m_connected;
|
|
bool m_triggersIsStopped;
|
|
std::map<QString, QStringList> m_online; // channel, nicks
|
|
QStringList m_readNamesList; // channel in reading
|
|
|
|
QString m_readingBuffer;
|
|
bool m_shouldAppendMessage;
|
|
|
|
private slots:
|
|
void onRead();
|
|
void onLogin();
|
|
void onDisconnected();
|
|
void pingTimedOut();
|
|
void actualizeUsersList();
|
|
void nickRecover();
|
|
|
|
signals:
|
|
void startInfo(QString server, QStringList channels);
|
|
void userOnline(QString server, QString channel, QStringList users);
|
|
void topicChanged(QString server, QString channel, QString topic);
|
|
void myOnline(QString server, quint8 status);
|
|
void myNickname(QString server, QString nick);
|
|
void newMessage(QString server, QString channel, QString nick, QString text);
|
|
};
|
|
|
|
#endif // IRCCLIENT_H
|