From a580b51f1acd592312e5b423c0f9b222fafa5efb Mon Sep 17 00:00:00 2001 From: Torsten Schulz Date: Thu, 15 Feb 2024 17:06:02 +0100 Subject: [PATCH] Fixed timeout --- src/app.cpp | 20 ++++++++++++-------- src/app.h | 2 ++ src/broadcast.cpp | 13 +++++++++---- src/broadcast.h | 2 +- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/app.cpp b/src/app.cpp index 61f8187..0edeb6a 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -1012,14 +1012,18 @@ void App::showHistory(Wt::Json::Object broadcast) { void App::connectionTimedOut() { showLogin(); + loginTimer_->stop(); + timeoutRemainingTimer_->stop(); + menuContainer_->clear(); + userListContainer_->clear(); triggerUpdate(); } void App::addLoginTimeView() { auto loggedinTimeWidget = menuContainer_->addNew(); loggedinTimeWidget->setStyleClass("menu-info-text"); - auto loginTimer = root()->addChild(std::make_unique()); - loginTimer->setInterval(std::chrono::seconds(1)); + loginTimer_ = root()->addChild(std::make_unique()); + loginTimer_->setInterval(std::chrono::seconds(1)); auto loggedInRefresh = [=, this]() { auto currentLoginSeconds = currentlyLoggedInSeconds(); int hours = currentLoginSeconds / 3600; @@ -1030,16 +1034,16 @@ void App::addLoginTimeView() { std::string elapsedTimeString = elapsedTimeStream.str(); loggedinTimeWidget->setText(Wt::WString("In chat for {1}").arg(elapsedTimeString)); }; - loginTimer->timeout().connect(loggedInRefresh); + loginTimer_->timeout().connect(loggedInRefresh); loggedInRefresh(); - loginTimer->start(); + loginTimer_->start(); } void App::addTimeoutView() { auto timeoutRemainingWidget = menuContainer_->addNew(); timeoutRemainingWidget->setStyleClass("menu-info-text"); - auto timeoutRemainingTimer = root()->addChild(std::make_unique()); - timeoutRemainingTimer->setInterval(std::chrono::milliseconds(500)); + timeoutRemainingTimer_ = root()->addChild(std::make_unique()); + timeoutRemainingTimer_->setInterval(std::chrono::milliseconds(500)); auto timeoutRemainingRefresh = [=, this]() { auto remainingLoginSeconds = remainingSecondsToTimeout(); int minutes = remainingLoginSeconds / 60; @@ -1050,9 +1054,9 @@ void App::addTimeoutView() { std::string elapsedTimeString = remainingTimeStream.str(); timeoutRemainingWidget->setText(Wt::WString("Remaining time before logout is {1}").arg(elapsedTimeString)); }; - timeoutRemainingTimer->timeout().connect(timeoutRemainingRefresh); + timeoutRemainingTimer_->timeout().connect(timeoutRemainingRefresh); timeoutRemainingRefresh(); - timeoutRemainingTimer->start(); + timeoutRemainingTimer_->start(); } void App::itemChanged(Wt::WCheckBox *item, Wt::WContainerWidget *dropDownContainer, Wt::WPushButton *openButton, std::unordered_set *saveItems) { diff --git a/src/app.h b/src/app.h index 786eeb0..f5088cc 100644 --- a/src/app.h +++ b/src/app.h @@ -90,6 +90,8 @@ private: int messageCursorPosition_{-1}; std::unique_ptr messageReceived_; Search searchFields; + Wt::WTimer *loginTimer_; + Wt::WTimer *timeoutRemainingTimer_; void setMetaTags(); void initApp(); void reSetUser(); diff --git a/src/broadcast.cpp b/src/broadcast.cpp index 5e69faf..12506dd 100644 --- a/src/broadcast.cpp +++ b/src/broadcast.cpp @@ -143,17 +143,22 @@ void Broadcast::run() { {"type", "timedout"}, {"data", "dummy"} }; + std::vector toDisconnect; for (;;) { std::this_thread::sleep_for(std::chrono::milliseconds(100)); + for (auto clientToDisconnect: toDisconnect) { + disconnect(clientToDisconnect); + } + toDisconnect.clear(); if (stop_) { return; } std::unique_lock lock(mutex_); for (auto &connection: connections_) { if (connection->client()->activitiesTimedOut()) { - disconnect(connection->client()); - addMessageToSessionBroadcast(connection->sessionId(), timedoutBroadcast); - continue; + auto sessionId = connection->sessionId(); + toDisconnect.push_back(connection->client()); + addMessageToSessionBroadcast(sessionId, timedoutBroadcast); } if (connection->getBroadcasts().size() == 0) { continue; @@ -605,7 +610,7 @@ void Client::setActivity() { } bool Client::activitiesTimedOut() { - auto timeDifference = Wt::WDateTime::currentDateTime().secsTo(lastActivity_); + auto timeDifference = lastActivity_.secsTo(Wt::WDateTime::currentDateTime()); return timeDifference > timeoutSeconds; } diff --git a/src/broadcast.h b/src/broadcast.h index 7de4168..f4fd69c 100644 --- a/src/broadcast.h +++ b/src/broadcast.h @@ -40,7 +40,7 @@ protected: void setLoggedIn(); void setLoggedOut(); private: - const int timeoutSeconds {1800}; + const int timeoutSeconds {5}; Wt::WDateTime lastActivity_; Wt::WDateTime loginTimeStamp_; };