Fixed timeout

This commit is contained in:
Torsten Schulz
2024-02-15 17:06:02 +01:00
parent bbf8412f7c
commit a580b51f1a
4 changed files with 24 additions and 13 deletions

View File

@@ -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<Wt::WText>();
loggedinTimeWidget->setStyleClass("menu-info-text");
auto loginTimer = root()->addChild(std::make_unique<Wt::WTimer>());
loginTimer->setInterval(std::chrono::seconds(1));
loginTimer_ = root()->addChild(std::make_unique<Wt::WTimer>());
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<Wt::WText>();
timeoutRemainingWidget->setStyleClass("menu-info-text");
auto timeoutRemainingTimer = root()->addChild(std::make_unique<Wt::WTimer>());
timeoutRemainingTimer->setInterval(std::chrono::milliseconds(500));
timeoutRemainingTimer_ = root()->addChild(std::make_unique<Wt::WTimer>());
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<std::string> *saveItems) {

View File

@@ -90,6 +90,8 @@ private:
int messageCursorPosition_{-1};
std::unique_ptr<Wt::WSound> messageReceived_;
Search searchFields;
Wt::WTimer *loginTimer_;
Wt::WTimer *timeoutRemainingTimer_;
void setMetaTags();
void initApp();
void reSetUser();

View File

@@ -143,17 +143,22 @@ void Broadcast::run() {
{"type", "timedout"},
{"data", "dummy"}
};
std::vector<Client *> 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<std::mutex> 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;
}

View File

@@ -40,7 +40,7 @@ protected:
void setLoggedIn();
void setLoggedOut();
private:
const int timeoutSeconds {1800};
const int timeoutSeconds {5};
Wt::WDateTime lastActivity_;
Wt::WDateTime loginTimeStamp_;
};