From 112426e30b00915ed5d48d494c32b6b173dd51f5 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Wed, 2 Feb 2022 19:03:01 +0100 Subject: [PATCH] Fetch previews for space children using /hierarchy --- CMakeLists.txt | 2 +- io.github.NhekoReborn.Nheko.yaml | 2 +- src/timeline/RoomlistModel.cpp | 93 ++++++++++++++++---------------- src/timeline/RoomlistModel.h | 3 +- 4 files changed, 52 insertions(+), 48 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7dd4d245..2ff9e9df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -402,7 +402,7 @@ if(USE_BUNDLED_MTXCLIENT) FetchContent_Declare( MatrixClient GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git - GIT_TAG 9781553b0186f2db9036d2abbde83c28828eb2b9 + GIT_TAG dc55f64862aeaf02d75383fbdadcbf64ea585506 ) set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "") set(BUILD_LIB_TESTS OFF CACHE INTERNAL "") diff --git a/io.github.NhekoReborn.Nheko.yaml b/io.github.NhekoReborn.Nheko.yaml index 700b6d02..8b835092 100644 --- a/io.github.NhekoReborn.Nheko.yaml +++ b/io.github.NhekoReborn.Nheko.yaml @@ -191,7 +191,7 @@ modules: buildsystem: cmake-ninja name: mtxclient sources: - - commit: 9781553b0186f2db9036d2abbde83c28828eb2b9 + - commit: dc55f64862aeaf02d75383fbdadcbf64ea585506 #tag: v0.6.1 type: git url: https://github.com/Nheko-Reborn/mtxclient.git 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( - 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( - roomid, - "", - [this, roomid, is_space](const mtx::events::state::Avatar &a, mtx::http::RequestErr) { - auto avatar_url = a.url; + nhlog::net()->info("Feched previews for children of {}: {}", roomid, h.rooms.size()); - http::client()->get_state_event( - 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( - 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); - } + 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; - // don't even add a preview, if we got not a single - // response - if (n.name.empty() && avatar_url.empty() && topic.empty()) - return; + emit fetchedPreview(QString::fromStdString(e.room_id), info); + } - RoomInfo info{}; - info.name = n.name; - info.is_space = is_space; - info.avatar_url = avatar_url; - info.topic = topic; - - const_cast(this)->fetchedPreview( - QString::fromStdString(roomid), info); - }); - }); - }); - }); + if (!h.next_batch.empty()) + fetchPreviews(roomid_, h.next_batch); + }, + from, + 50, + 1, + false); } std::set 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 updateDMs(mtx::events::AccountDataEvent 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();