inline QByteArray readChannelCipherKey(const QString &channel) const { return _cipherKeys.value(channel.toLower()); }
inline void storeChannelCipherKey(const QString &channel, const QByteArray &key) { _cipherKeys[channel.toLower()] = key; }
- inline bool isAutoWhoInProgress(const QString &channel) const { return _autoWhoPending.value(channel.toLower(), 0); }
+ /**
+ * Checks if the given target has an automatic WHO in progress
+ *
+ * @param name Channel or nickname
+ * @return True if an automatic WHO is in progress, otherwise false
+ */
+ inline bool isAutoWhoInProgress(const QString &name) const
+ {
+ return _autoWhoPending.value(name.toLower(), 0);
+ }
inline UserId userId() const { return _coreSession->user(); }
*/
inline bool disconnectExpected() const { return _disconnectExpected; }
+ /**
+ * Gets whether or not the server replies to automated PINGs with a valid timestamp
+ *
+ * Distinguishes between servers that reply by quoting the text sent, and those that respond
+ * with whatever they want.
+ *
+ * @return True if a valid timestamp has been received as a PONG, otherwise false.
+ */
+ inline bool isPongTimestampValid() const { return _pongTimestampValid; }
+
+ /**
+ * Gets whether or not an automated PING has been sent without any PONG received
+ *
+ * Reset whenever any PONG is received, not just the automated one sent.
+ *
+ * @return True if a PING has been sent without a PONG received, otherwise false.
+ */
+ inline bool isPongReplyPending() const { return _pongReplyPending; }
+
QList<QList<QByteArray>> splitMessage(const QString &cmd, const QString &message, std::function<QList<QByteArray>(QString &)> cmdGenerator);
// IRCv3 capability negotiation
void setPingInterval(int interval);
+ /**
+ * Sets whether or not the IRC server has replied to PING with a valid timestamp
+ *
+ * This allows determining whether or not an IRC server responds to PING with a PONG that quotes
+ * what was sent, or if it does something else (and therefore PONGs should be more aggressively
+ * hidden).
+ *
+ * @param timestampValid If true, a valid timestamp has been received via PONG reply
+ */
+ void setPongTimestampValid(bool validTimestamp);
+
void connectToIrc(bool reconnecting = false);
/**
* Disconnect from the IRC server.
* When 'away-notify' is enabled, this will trigger an immediate AutoWho since regular
* who-cycles are disabled as per IRCv3 specifications.
*
- * @param[in] channelOrNick Channel or nickname to WHO
+ * @param[in] name Channel or nickname
*/
- void queueAutoWhoOneshot(const QString &channelOrNick);
+ void queueAutoWhoOneshot(const QString &name);
- bool setAutoWhoDone(const QString &channel);
+ /**
+ * Checks if the given target has an automatic WHO in progress, and sets it as done if so
+ *
+ * @param name Channel or nickname
+ * @return True if an automatic WHO is in progress (and should be silenced), otherwise false
+ */
+ bool setAutoWhoDone(const QString &name);
void updateIssuedModes(const QString &requestedModes);
void updatePersistentModes(QString addModes, QString removeModes);
inline void resetPingTimeout() { _pingCount = 0; }
+ /**
+ * Marks the network as no longer having a pending reply to an automated PING
+ */
+ inline void resetPongReplyPending() { _pongReplyPending = false; }
+
inline void displayMsg(Message::Type msgType, BufferInfo::Type bufferType, const QString &target, const QString &text, const QString &sender = "", Message::Flags flags = Message::None)
{
emit displayMsg(networkId(), msgType, bufferType, target, text, sender, flags);
private:
CoreSession *_coreSession;
+ bool _debugLogRawIrc; ///< If true, include raw IRC socket messages in the debug log
+ qint32 _debugLogRawNetId; ///< Network ID for logging raw IRC socket messages, or -1 for all
+
#ifdef HAVE_SSL
QSslSocket socket;
#else
int _lastUsedServerIndex;
QTimer _pingTimer;
- qint64 _lastPingTime;
- uint _pingCount;
- bool _sendPings;
+ qint64 _lastPingTime = 0; ///< Unix time of most recently sent automatic ping
+ uint _pingCount = 0; ///< Unacknowledged automatic pings
+ bool _sendPings = false; ///< If true, pings should be periodically sent to server
+ bool _pongTimestampValid = false; ///< If true, IRC server responds to PING by quoting in PONG
+ // This tracks whether or not a server responds to PING with a PONG of what was sent, or if it
+ // does something else. If false, PING reply hiding should be more aggressive.
+ bool _pongReplyPending = false; ///< If true, at least one PING sent without a PONG reply
QStringList _autoWhoQueue;
QHash<QString, int> _autoWhoPending;