diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c2f0242e..e790eb912 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ - Bugfix: If a network request errors with 200 OK, Qt's error code is now reported instead of the HTTP status. (#5378) - Bugfix: Fixed restricted users usernames not being clickable. (#5405) - Bugfix: Fixed a crash that could occur when logging was enabled in IRC servers that were removed. (#5419) +- Bugfix: Fixed message history occasionally not loading after a sleep. (#5457) - Dev: Update Windows build from Qt 6.5.0 to Qt 6.7.1. (#5420) - Dev: Update vcpkg build Qt from 6.5.0 to 6.7.0, boost from 1.83.0 to 1.85.0, openssl from 3.1.3 to 3.3.0. (#5422) - Dev: Use Qt's high DPI scaling. (#4868, #5400) diff --git a/src/providers/irc/IrcConnection2.cpp b/src/providers/irc/IrcConnection2.cpp index 9f97e6db6..19f327c24 100644 --- a/src/providers/irc/IrcConnection2.cpp +++ b/src/providers/irc/IrcConnection2.cpp @@ -3,6 +3,10 @@ #include "common/QLogging.hpp" #include "common/Version.hpp" +#include + +using namespace std::chrono_literals; + namespace chatterino { namespace { @@ -56,6 +60,7 @@ IrcConnection::IrcConnection(QObject *parent) // Send ping every x seconds this->pingTimer_.setInterval(5000); this->pingTimer_.start(); + this->lastPing_ = std::chrono::system_clock::now(); QObject::connect(&this->pingTimer_, &QTimer::timeout, [this] { if (this->isConnected()) { @@ -64,7 +69,25 @@ IrcConnection::IrcConnection(QObject *parent) // If we're still receiving messages, all is well this->recentlyReceivedMessage_ = false; this->waitingForPong_ = false; - this->heartbeat.invoke(); + + // Check if we got invoked too late (e.g. due to a sleep) + auto now = std::chrono::system_clock::now(); + auto elapsed = now - this->lastPing_; + if (elapsed < 3 * 5000ms) + { + this->heartbeat.invoke(); + } + else + { + qCDebug(chatterinoIrc).nospace() + << "Got late ping (skipping heartbeat): " + << std::chrono::duration_cast< + std::chrono::milliseconds>(elapsed) + .count() + << "ms"; + } + this->lastPing_ = now; + return; } diff --git a/src/providers/irc/IrcConnection2.hpp b/src/providers/irc/IrcConnection2.hpp index 150793ec8..0e269397c 100644 --- a/src/providers/irc/IrcConnection2.hpp +++ b/src/providers/irc/IrcConnection2.hpp @@ -6,6 +6,8 @@ #include #include +#include + namespace chatterino { class IrcConnection : public Communi::IrcConnection @@ -33,6 +35,7 @@ private: QTimer pingTimer_; QTimer reconnectTimer_; std::atomic recentlyReceivedMessage_{true}; + std::chrono::time_point lastPing_; // Reconnect with a base delay of 1 second and max out at 1 second * (2^(5-1)) (i.e. 16 seconds) ExponentialBackoff<5> reconnectBackoff_{std::chrono::milliseconds{1000}};