diff options
author | Nicolas Werner <n.werner@famedly.com> | 2022-02-02 19:03:01 +0100 |
---|---|---|
committer | Nicolas Werner <n.werner@famedly.com> | 2022-02-02 19:03:01 +0100 |
commit | 112426e30b00915ed5d48d494c32b6b173dd51f5 (patch) | |
tree | d731028b25511625a4a7ee52c4881e4ee36cc127 /src | |
parent | split point is pointless (diff) | |
download | nheko-112426e30b00915ed5d48d494c32b6b173dd51f5.tar.xz |
Fetch previews for space children using /hierarchy
Diffstat (limited to 'src')
-rw-r--r-- | src/timeline/RoomlistModel.cpp | 99 | ||||
-rw-r--r-- | src/timeline/RoomlistModel.h | 3 |
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(); |