From 9219926a74b954b5915f2a9e4e3900604aca577b Mon Sep 17 00:00:00 2001 From: Camila Date: Wed, 24 Mar 2021 15:16:12 +0100 Subject: [PATCH] Add checks in case userStatus is not available/fails on the server side. Signed-off-by: Camila --- src/gui/tray/UserModel.cpp | 10 +++++++++- src/gui/tray/UserModel.h | 1 + src/gui/userstatus.cpp | 17 +++++++++++++++-- src/gui/userstatus.h | 6 ++---- src/libsync/capabilities.cpp | 5 +++++ src/libsync/capabilities.h | 1 + 6 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/gui/tray/UserModel.cpp b/src/gui/tray/UserModel.cpp index 3d29b5226..89345c932 100644 --- a/src/gui/tray/UserModel.cpp +++ b/src/gui/tray/UserModel.cpp @@ -186,6 +186,8 @@ void User::slotRefreshImmediately() { void User::slotRefresh() { + slotRefreshUserStatus(); + if (checkPushNotificationsAreReady()) { // we are relying on WebSocket push notifications - ignore refresh attempts from UI _timeSinceLastCheck[_account.data()].invalidate(); @@ -208,7 +210,6 @@ void User::slotRefresh() slotRefreshActivities(); } slotRefreshNotifications(); - _account.data()->fetchUserStatus(); timer.start(); } } @@ -218,6 +219,13 @@ void User::slotRefreshActivities() _activityModel->slotRefreshActivity(); } +void User::slotRefreshUserStatus() { + // TODO: check for _account->account()->capabilities().userStatus() + if (_account.data() && _account.data()->isConnected()) { + _account.data()->fetchUserStatus(); + } +} + void User::slotRefreshNotifications() { // start a server notification handler if no notification requests diff --git a/src/gui/tray/UserModel.h b/src/gui/tray/UserModel.h index bc38b9ea1..527dd1949 100644 --- a/src/gui/tray/UserModel.h +++ b/src/gui/tray/UserModel.h @@ -74,6 +74,7 @@ public slots: void slotRefreshNotifications(); void slotRefreshActivities(); void slotRefresh(); + void slotRefreshUserStatus(); void slotRefreshImmediately(); void setNotificationRefreshInterval(std::chrono::milliseconds interval); void slotRebuildNavigationAppList(); diff --git a/src/gui/userstatus.cpp b/src/gui/userstatus.cpp index 5030158e6..dc6866889 100644 --- a/src/gui/userstatus.cpp +++ b/src/gui/userstatus.cpp @@ -26,6 +26,8 @@ namespace OCC { +Q_LOGGING_CATEGORY(lcUserStatus, "nextcloud.gui.userstatus", QtInfoMsg) + UserStatus::UserStatus(QObject *parent) : QObject(parent) , _message("") @@ -51,9 +53,20 @@ void UserStatus::fetchUserStatus(AccountPtr account) _job->start(); } -void UserStatus::slotFetchUserStatusFinished(const QJsonDocument &json) +void UserStatus::slotFetchUserStatusFinished(const QJsonDocument &json, const int statusCode) { - const auto retrievedData = json.object().value("ocs").toObject().value("data").toObject(); + const QJsonObject defaultValues + { + {"icon", ""}, + {"message", ""}, + {"status", "online"} + }; + + if (statusCode != 200) { + qCInfo(lcUserStatus) << "Slot fetch UserStatus finished with status code" << statusCode; + qCInfo(lcUserStatus) << "Using then default values as if user has not set any status" << defaultValues; + } + const auto retrievedData = json.object().value("ocs").toObject().value("data").toObject(defaultValues); const auto emoji = retrievedData.value("icon").toString(); const auto message = retrievedData.value("message").toString(); auto statusString = retrievedData.value("status").toString(); diff --git a/src/gui/userstatus.h b/src/gui/userstatus.h index 263f55cd9..ef35eda51 100644 --- a/src/gui/userstatus.h +++ b/src/gui/userstatus.h @@ -15,13 +15,11 @@ #ifndef USERSTATUS_H #define USERSTATUS_H -#include #include -#include -#include #include "accountfwd.h" namespace OCC { + class JsonApiJob; class UserStatus : public QObject @@ -44,7 +42,7 @@ public: QUrl icon() const; private slots: - void slotFetchUserStatusFinished(const QJsonDocument &json); + void slotFetchUserStatusFinished(const QJsonDocument &json, const int statusCode); signals: void fetchUserStatusFinished(); diff --git a/src/libsync/capabilities.cpp b/src/libsync/capabilities.cpp index 2f980a748..4b991348e 100644 --- a/src/libsync/capabilities.cpp +++ b/src/libsync/capabilities.cpp @@ -177,6 +177,11 @@ bool Capabilities::chunkingNg() const return _capabilities["dav"].toMap()["chunking"].toByteArray() >= "1.0"; } +bool Capabilities::userStatus() const +{ + return _capabilities.contains("notifications") && _capabilities["notifications"].toMap().contains("user-status"); +} + PushNotificationTypes Capabilities::availablePushNotifications() const { if (!_capabilities.contains("notify_push")) { diff --git a/src/libsync/capabilities.h b/src/libsync/capabilities.h index 06ecaf4f1..11f784875 100644 --- a/src/libsync/capabilities.h +++ b/src/libsync/capabilities.h @@ -56,6 +56,7 @@ public: bool sharePublicLinkMultiple() const; bool shareResharing() const; bool chunkingNg() const; + bool userStatus() const; /// Returns which kind of push notfications are available PushNotificationTypes availablePushNotifications() const; -- 2.30.2