#ifndef IRCCLIENT_H #define IRCCLIENT_H #include "connectiondata.h" #include #include #include #include #include #include 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, NamesList = 353, 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; // really need it? QTimer m_pingTimeout; 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"}; bool m_reconnectReport; bool m_connected; std::map m_online; // channel, nicks 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 someAction(QString server, QString channel, QStringList users); void myOnline(QString server, quint8 status); void myNickname(QString server, QString nick); }; #endif // IRCCLIENT_H