Fixed timeout
This commit is contained in:
20
src/app.cpp
20
src/app.cpp
@@ -1012,14 +1012,18 @@ void App::showHistory(Wt::Json::Object broadcast) {
|
|||||||
|
|
||||||
void App::connectionTimedOut() {
|
void App::connectionTimedOut() {
|
||||||
showLogin();
|
showLogin();
|
||||||
|
loginTimer_->stop();
|
||||||
|
timeoutRemainingTimer_->stop();
|
||||||
|
menuContainer_->clear();
|
||||||
|
userListContainer_->clear();
|
||||||
triggerUpdate();
|
triggerUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void App::addLoginTimeView() {
|
void App::addLoginTimeView() {
|
||||||
auto loggedinTimeWidget = menuContainer_->addNew<Wt::WText>();
|
auto loggedinTimeWidget = menuContainer_->addNew<Wt::WText>();
|
||||||
loggedinTimeWidget->setStyleClass("menu-info-text");
|
loggedinTimeWidget->setStyleClass("menu-info-text");
|
||||||
auto loginTimer = root()->addChild(std::make_unique<Wt::WTimer>());
|
loginTimer_ = root()->addChild(std::make_unique<Wt::WTimer>());
|
||||||
loginTimer->setInterval(std::chrono::seconds(1));
|
loginTimer_->setInterval(std::chrono::seconds(1));
|
||||||
auto loggedInRefresh = [=, this]() {
|
auto loggedInRefresh = [=, this]() {
|
||||||
auto currentLoginSeconds = currentlyLoggedInSeconds();
|
auto currentLoginSeconds = currentlyLoggedInSeconds();
|
||||||
int hours = currentLoginSeconds / 3600;
|
int hours = currentLoginSeconds / 3600;
|
||||||
@@ -1030,16 +1034,16 @@ void App::addLoginTimeView() {
|
|||||||
std::string elapsedTimeString = elapsedTimeStream.str();
|
std::string elapsedTimeString = elapsedTimeStream.str();
|
||||||
loggedinTimeWidget->setText(Wt::WString("In chat for {1}").arg(elapsedTimeString));
|
loggedinTimeWidget->setText(Wt::WString("In chat for {1}").arg(elapsedTimeString));
|
||||||
};
|
};
|
||||||
loginTimer->timeout().connect(loggedInRefresh);
|
loginTimer_->timeout().connect(loggedInRefresh);
|
||||||
loggedInRefresh();
|
loggedInRefresh();
|
||||||
loginTimer->start();
|
loginTimer_->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void App::addTimeoutView() {
|
void App::addTimeoutView() {
|
||||||
auto timeoutRemainingWidget = menuContainer_->addNew<Wt::WText>();
|
auto timeoutRemainingWidget = menuContainer_->addNew<Wt::WText>();
|
||||||
timeoutRemainingWidget->setStyleClass("menu-info-text");
|
timeoutRemainingWidget->setStyleClass("menu-info-text");
|
||||||
auto timeoutRemainingTimer = root()->addChild(std::make_unique<Wt::WTimer>());
|
timeoutRemainingTimer_ = root()->addChild(std::make_unique<Wt::WTimer>());
|
||||||
timeoutRemainingTimer->setInterval(std::chrono::milliseconds(500));
|
timeoutRemainingTimer_->setInterval(std::chrono::milliseconds(500));
|
||||||
auto timeoutRemainingRefresh = [=, this]() {
|
auto timeoutRemainingRefresh = [=, this]() {
|
||||||
auto remainingLoginSeconds = remainingSecondsToTimeout();
|
auto remainingLoginSeconds = remainingSecondsToTimeout();
|
||||||
int minutes = remainingLoginSeconds / 60;
|
int minutes = remainingLoginSeconds / 60;
|
||||||
@@ -1050,9 +1054,9 @@ void App::addTimeoutView() {
|
|||||||
std::string elapsedTimeString = remainingTimeStream.str();
|
std::string elapsedTimeString = remainingTimeStream.str();
|
||||||
timeoutRemainingWidget->setText(Wt::WString("Remaining time before logout is {1}").arg(elapsedTimeString));
|
timeoutRemainingWidget->setText(Wt::WString("Remaining time before logout is {1}").arg(elapsedTimeString));
|
||||||
};
|
};
|
||||||
timeoutRemainingTimer->timeout().connect(timeoutRemainingRefresh);
|
timeoutRemainingTimer_->timeout().connect(timeoutRemainingRefresh);
|
||||||
timeoutRemainingRefresh();
|
timeoutRemainingRefresh();
|
||||||
timeoutRemainingTimer->start();
|
timeoutRemainingTimer_->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void App::itemChanged(Wt::WCheckBox *item, Wt::WContainerWidget *dropDownContainer, Wt::WPushButton *openButton, std::unordered_set<std::string> *saveItems) {
|
void App::itemChanged(Wt::WCheckBox *item, Wt::WContainerWidget *dropDownContainer, Wt::WPushButton *openButton, std::unordered_set<std::string> *saveItems) {
|
||||||
|
|||||||
@@ -90,6 +90,8 @@ private:
|
|||||||
int messageCursorPosition_{-1};
|
int messageCursorPosition_{-1};
|
||||||
std::unique_ptr<Wt::WSound> messageReceived_;
|
std::unique_ptr<Wt::WSound> messageReceived_;
|
||||||
Search searchFields;
|
Search searchFields;
|
||||||
|
Wt::WTimer *loginTimer_;
|
||||||
|
Wt::WTimer *timeoutRemainingTimer_;
|
||||||
void setMetaTags();
|
void setMetaTags();
|
||||||
void initApp();
|
void initApp();
|
||||||
void reSetUser();
|
void reSetUser();
|
||||||
|
|||||||
@@ -143,17 +143,22 @@ void Broadcast::run() {
|
|||||||
{"type", "timedout"},
|
{"type", "timedout"},
|
||||||
{"data", "dummy"}
|
{"data", "dummy"}
|
||||||
};
|
};
|
||||||
|
std::vector<Client *> toDisconnect;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||||
|
for (auto clientToDisconnect: toDisconnect) {
|
||||||
|
disconnect(clientToDisconnect);
|
||||||
|
}
|
||||||
|
toDisconnect.clear();
|
||||||
if (stop_) {
|
if (stop_) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
std::unique_lock<std::mutex> lock(mutex_);
|
std::unique_lock<std::mutex> lock(mutex_);
|
||||||
for (auto &connection: connections_) {
|
for (auto &connection: connections_) {
|
||||||
if (connection->client()->activitiesTimedOut()) {
|
if (connection->client()->activitiesTimedOut()) {
|
||||||
disconnect(connection->client());
|
auto sessionId = connection->sessionId();
|
||||||
addMessageToSessionBroadcast(connection->sessionId(), timedoutBroadcast);
|
toDisconnect.push_back(connection->client());
|
||||||
continue;
|
addMessageToSessionBroadcast(sessionId, timedoutBroadcast);
|
||||||
}
|
}
|
||||||
if (connection->getBroadcasts().size() == 0) {
|
if (connection->getBroadcasts().size() == 0) {
|
||||||
continue;
|
continue;
|
||||||
@@ -605,7 +610,7 @@ void Client::setActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Client::activitiesTimedOut() {
|
bool Client::activitiesTimedOut() {
|
||||||
auto timeDifference = Wt::WDateTime::currentDateTime().secsTo(lastActivity_);
|
auto timeDifference = lastActivity_.secsTo(Wt::WDateTime::currentDateTime());
|
||||||
return timeDifference > timeoutSeconds;
|
return timeDifference > timeoutSeconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ protected:
|
|||||||
void setLoggedIn();
|
void setLoggedIn();
|
||||||
void setLoggedOut();
|
void setLoggedOut();
|
||||||
private:
|
private:
|
||||||
const int timeoutSeconds {1800};
|
const int timeoutSeconds {5};
|
||||||
Wt::WDateTime lastActivity_;
|
Wt::WDateTime lastActivity_;
|
||||||
Wt::WDateTime loginTimeStamp_;
|
Wt::WDateTime loginTimeStamp_;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user