summary refs log tree commit diff
path: root/src/UserDirectoryModel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/UserDirectoryModel.cpp')
-rw-r--r--src/UserDirectoryModel.cpp105
1 files changed, 105 insertions, 0 deletions
diff --git a/src/UserDirectoryModel.cpp b/src/UserDirectoryModel.cpp
new file mode 100644
index 00000000..2c44df40
--- /dev/null
+++ b/src/UserDirectoryModel.cpp
@@ -0,0 +1,105 @@
+// SPDX-FileCopyrightText: 2021 Nheko Contributors
+// SPDX-FileCopyrightText: 2022 Nheko Contributors
+// SPDX-FileCopyrightText: 2023 Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "UserDirectoryModel.h"
+
+#include "Cache.h"
+#include "Logging.h"
+#include <QSharedPointer>
+#include "MatrixClient.h"
+#include "mtx/responses/users.hpp"
+
+UserDirectoryModel::UserDirectoryModel(QObject *parent)
+  : QAbstractListModel{parent}
+{
+}
+
+QHash<int, QByteArray>
+UserDirectoryModel::roleNames() const
+{
+    return {
+      {Roles::DisplayName, "displayName"},
+      {Roles::Mxid, "userid"},
+      {Roles::AvatarUrl, "avatarUrl"},
+    };
+}
+
+void
+UserDirectoryModel::setSearchString(const QString &f)
+{
+    userSearchString_ = f.toStdString();
+    nhlog::ui()->debug("Received user directory query: {}", userSearchString_);
+    beginResetModel();
+    results_.clear();
+    if (userSearchString_ == "")
+        nhlog::ui()->debug("Rejecting empty search string");
+    else
+        canFetchMore_ = true;
+    endResetModel();
+}
+
+void
+UserDirectoryModel::fetchMore(const QModelIndex &)
+{
+    if (!canFetchMore_)
+        return;
+
+    nhlog::net()->debug("Fetching users from mtxclient...");
+    std::string searchTerm = userSearchString_;
+    searchingUsers_ = true;
+    emit searchingUsersChanged();
+    auto job = QSharedPointer<FetchUsersFromDirectoryJob>::create();
+    connect(job.data(),
+            &FetchUsersFromDirectoryJob::fetchedSearchResults,
+            this,
+            &UserDirectoryModel::displaySearchResults);
+    http::client()->search_user_directory(
+      searchTerm,
+      [job, searchTerm](const mtx::responses::Users &res, mtx::http::RequestErr err) {
+          if (err) {
+              nhlog::net()->error("Failed to retrieve users from mtxclient - {} - {} - {}",
+                                  mtx::errors::to_string(err->matrix_error.errcode),
+                                  err->matrix_error.error,
+                                  err->parse_error);
+          } else {
+              emit job->fetchedSearchResults(res.results, searchTerm);
+          }
+      },
+      50);
+}
+
+QVariant
+UserDirectoryModel::data(const QModelIndex &index, int role) const
+{
+    if (!index.isValid() || index.row() >= (int)results_.size() || index.row() < 0)
+        return {};
+    switch (role) {
+    case Roles::DisplayName:
+        return QString::fromStdString(results_[index.row()].display_name);
+    case Roles::Mxid:
+        return QString::fromStdString(results_[index.row()].user_id);
+    case Roles::AvatarUrl:
+        return QString::fromStdString(results_[index.row()].avatar_url);
+    }
+    return {};
+}
+
+void
+UserDirectoryModel::displaySearchResults(std::vector<mtx::responses::User> results, const std::string &searchTerm)
+{
+    if (searchTerm != this->userSearchString_)
+        return;
+    searchingUsers_ = false;
+    emit searchingUsersChanged();
+    if (results.empty()) {
+        nhlog::net()->debug("mtxclient helper thread yielded no results!");
+        return;
+    }
+    beginInsertRows(QModelIndex(), 0, static_cast<int>(results.size()) - 1);
+    results_ = results;
+    endInsertRows();
+    canFetchMore_ = false;
+}