#include "IrcConnection2.hpp" #include "common/Version.hpp" namespace chatterino { namespace { const auto payload = QString("chatterino/" CHATTERINO_VERSION); } // namespace IrcConnection::IrcConnection(QObject *parent) : Communi::IrcConnection(parent) { // send ping every x seconds this->pingTimer_.setInterval(5000); this->pingTimer_.start(); QObject::connect(&this->pingTimer_, &QTimer::timeout, [this] { if (this->isConnected()) { if (this->waitingForPong_.load()) { // Not sending another ping as we haven't received the matching pong yet return; } if (!this->recentlyReceivedMessage_.load()) { this->sendRaw("PING " + payload); this->reconnectTimer_.start(); this->waitingForPong_ = true; } this->recentlyReceivedMessage_ = false; } }); // reconnect after x seconds without receiving a message this->reconnectTimer_.setInterval(5000); this->reconnectTimer_.setSingleShot(true); QObject::connect(&this->reconnectTimer_, &QTimer::timeout, [this] { if (this->isConnected()) { reconnectRequested.invoke(); } }); QObject::connect(this, &Communi::IrcConnection::connected, this, [this] { this->waitingForPong_ = false; }); QObject::connect(this, &Communi::IrcConnection::pongMessageReceived, [this](Communi::IrcPongMessage *message) { if (message->argument() == payload) { this->waitingForPong_ = false; } }); QObject::connect( this, &Communi::IrcConnection::messageReceived, [this](Communi::IrcMessage *message) { this->recentlyReceivedMessage_ = true; if (this->reconnectTimer_.isActive()) { this->reconnectTimer_.stop(); // The reconnect timer had started, that means we were waiting for a pong. // Since we received a message, this means that any pong response is meaningless, so we can just stop waiting for the pong and send another ping soon:tm: this->waitingForPong_ = false; } }); } } // namespace chatterino