summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNicolas Werner <n.werner@famedly.com>2022-02-02 19:03:01 +0100
committerNicolas Werner <n.werner@famedly.com>2022-02-02 19:03:01 +0100
commit112426e30b00915ed5d48d494c32b6b173dd51f5 (patch)
treed731028b25511625a4a7ee52c4881e4ee36cc127 /src
parentsplit point is pointless (diff)
downloadnheko-112426e30b00915ed5d48d494c32b6b173dd51f5.tar.xz
Fetch previews for space children using /hierarchy
Diffstat (limited to 'src')
-rw-r--r--src/timeline/RoomlistModel.cpp99
-rw-r--r--src/timeline/RoomlistModel.h3
2 files changed, 53 insertions, 49 deletions
diff --git a/src/timeline/RoomlistModel.cpp b/src/timeline/RoomlistModel.cpp
index aa81f501..3846b643 100644
--- a/src/timeline/RoomlistModel.cpp
+++ b/src/timeline/RoomlistModel.cpp
@@ -207,7 +207,6 @@ RoomlistModel::data(const QModelIndex &index, int role) const
             else if (role == Roles::IsPreviewFetched)
                 return false;
 
-            fetchPreview(roomid);
             switch (role) {
             case Roles::AvatarUrl:
                 return QString();
@@ -386,56 +385,60 @@ RoomlistModel::addRoom(const QString &room_id, bool suppressInsertNotification)
 }
 
 void
-RoomlistModel::fetchPreview(QString roomid_) const
+RoomlistModel::fetchPreviews(QString roomid_, const std::string &from)
 {
-    std::string roomid = roomid_.toStdString();
-    http::client()->get_state_event<mtx::events::state::Create>(
-      roomid, "", [this, roomid](const mtx::events::state::Create &c, mtx::http::RequestErr err) {
-          bool is_space = false;
-          if (!err) {
-              is_space = c.type == mtx::events::state::room_type::space;
+    auto roomid = roomid_.toStdString();
+    if (from.empty()) {
+        // check if we need to fetch anything
+        auto children = cache::client()->getChildRoomIds(roomid);
+        bool fetch    = false;
+        for (const auto &c : children) {
+            auto id = QString::fromStdString(c);
+            if (invites.contains(id) || models.contains(id) ||
+                (previewedRooms.contains(id) && previewedRooms.value(id).has_value()))
+                continue;
+            else {
+                fetch = true;
+                break;
+            }
+        }
+        if (!fetch) {
+            nhlog::net()->info("Not feching previews for children of {}", roomid);
+            return;
+        }
+    }
+
+    nhlog::net()->info("Feching previews for children of {}", roomid);
+    http::client()->get_hierarchy(
+      roomid,
+      [this, roomid, roomid_](const mtx::responses::HierarchyRooms &h, mtx::http::RequestErr err) {
+          if (err) {
+              nhlog::net()->error("Failed to fetch previews for children of {}: {}", roomid, *err);
+              return;
           }
 
-          http::client()->get_state_event<mtx::events::state::Avatar>(
-            roomid,
-            "",
-            [this, roomid, is_space](const mtx::events::state::Avatar &a, mtx::http::RequestErr) {
-                auto avatar_url = a.url;
-
-                http::client()->get_state_event<mtx::events::state::Topic>(
-                  roomid,
-                  "",
-                  [this, roomid, avatar_url, is_space](const mtx::events::state::Topic &t,
-                                                       mtx::http::RequestErr) {
-                      auto topic = t.topic;
-                      http::client()->get_state_event<mtx::events::state::Name>(
-                        roomid,
-                        "",
-                        [this, roomid, topic, avatar_url, is_space](
-                          const mtx::events::state::Name &n, mtx::http::RequestErr err) {
-                            if (err) {
-                                nhlog::net()->warn("Failed to fetch name event to "
-                                                   "create preview for {}",
-                                                   roomid);
-                            }
-
-                            // don't even add a preview, if we got not a single
-                            // response
-                            if (n.name.empty() && avatar_url.empty() && topic.empty())
-                                return;
-
-                            RoomInfo info{};
-                            info.name       = n.name;
-                            info.is_space   = is_space;
-                            info.avatar_url = avatar_url;
-                            info.topic      = topic;
-
-                            const_cast<RoomlistModel *>(this)->fetchedPreview(
-                              QString::fromStdString(roomid), info);
-                        });
-                  });
-            });
-      });
+          nhlog::net()->info("Feched previews for children of {}: {}", roomid, h.rooms.size());
+
+          for (const auto &e : h.rooms) {
+              RoomInfo info{};
+              info.name         = e.name;
+              info.is_space     = e.room_type == mtx::events::state::room_type::space;
+              info.avatar_url   = e.avatar_url;
+              info.topic        = e.topic;
+              info.guest_access = e.guest_can_join;
+              info.join_rule    = e.join_rule;
+              info.member_count = e.num_joined_members;
+
+              emit fetchedPreview(QString::fromStdString(e.room_id), info);
+          }
+
+          if (!h.next_batch.empty())
+              fetchPreviews(roomid_, h.next_batch);
+      },
+      from,
+      50,
+      1,
+      false);
 }
 
 std::set<QString>
diff --git a/src/timeline/RoomlistModel.h b/src/timeline/RoomlistModel.h
index 0671c3db..2476b21b 100644
--- a/src/timeline/RoomlistModel.h
+++ b/src/timeline/RoomlistModel.h
@@ -123,7 +123,7 @@ signals:
 
 private:
     void addRoom(const QString &room_id, bool suppressInsertNotification = false);
-    void fetchPreview(QString roomid) const;
+    void fetchPreviews(QString roomid, const std::string &from = "");
     std::set<QString> updateDMs(mtx::events::AccountDataEvent<mtx::events::account_data::Direct> e);
 
     TimelineViewManager *manager = nullptr;
@@ -189,6 +189,7 @@ public slots:
         } else if (tagId.startsWith(QLatin1String("space:"))) {
             filterType = FilterBy::Space;
             filterStr  = tagId.mid(6);
+            roomlistmodel->fetchPreviews(filterStr);
         } else if (tagId.startsWith(QLatin1String("dm"))) {
             filterType = FilterBy::DirectChats;
             filterStr.clear();