Add checks in case userStatus is not available/fails on the server side.
authorCamila <hello@camila.codes>
Wed, 24 Mar 2021 14:16:12 +0000 (15:16 +0100)
committerCamila <hello@camila.codes>
Wed, 24 Mar 2021 14:42:26 +0000 (15:42 +0100)
Signed-off-by: Camila <hello@camila.codes>
src/gui/tray/UserModel.cpp
src/gui/tray/UserModel.h
src/gui/userstatus.cpp
src/gui/userstatus.h
src/libsync/capabilities.cpp
src/libsync/capabilities.h

index 3d29b522692b95caf332e297a405bd4b4f32d297..89345c9328ab71e0b0a26e5d50132af38a9e3232 100644 (file)
@@ -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
index bc38b9ea1f891da49f1aabfb4210310555042f29..527dd19490c00cc681b2914512d1d9ed09fc378b 100644 (file)
@@ -74,6 +74,7 @@ public slots:
     void slotRefreshNotifications();
     void slotRefreshActivities();
     void slotRefresh();
+    void slotRefreshUserStatus();
     void slotRefreshImmediately();
     void setNotificationRefreshInterval(std::chrono::milliseconds interval);
     void slotRebuildNavigationAppList();
index 5030158e64ddea5ba1b6a674b00cc3c65fb20e8f..dc6866889e065f38b396b6021fb9070014b9b458 100644 (file)
@@ -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(); 
index 263f55cd92cdeeed37c695f11625376fc96e132c..ef35eda5149601d6986c2837c8a993a1bf7b7b6f 100644 (file)
 #ifndef USERSTATUS_H
 #define USERSTATUS_H
 
-#include <QObject>
 #include <QPointer>
-#include <QVariant>
-#include <QMetaEnum>
 #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();
index 2f980a7489300d5b55e25884a2270b92c58acb40..4b991348e8f6e0b2b38ec60ff9680099365e4aa4 100644 (file)
@@ -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")) {
index 06ecaf4f1c49e426dc8cad86a22bf60298fd028b..11f7848756085da934e909b88241faec7ecdf1f9 100644 (file)
@@ -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;