summary refs log tree commit diff
path: root/src/timeline2/TimelineModel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/timeline2/TimelineModel.cpp')
-rw-r--r--src/timeline2/TimelineModel.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/timeline2/TimelineModel.cpp b/src/timeline2/TimelineModel.cpp

index b13a1e6a..10a5d3bf 100644 --- a/src/timeline2/TimelineModel.cpp +++ b/src/timeline2/TimelineModel.cpp
@@ -24,6 +24,14 @@ senderId(const T &event) } } +TimelineModel::TimelineModel(QString room_id, QObject *parent) + : QAbstractListModel(parent) + , room_id_(room_id) +{ + connect( + this, &TimelineModel::oldMessagesRetrieved, this, &TimelineModel::addBackwardsEvents); +} + QHash<int, QByteArray> TimelineModel::roleNames() const { @@ -65,6 +73,11 @@ TimelineModel::data(const QModelIndex &index, int role) const void TimelineModel::addEvents(const mtx::responses::Timeline &events) { + if (isInitialSync) { + prev_batch_token_ = QString::fromStdString(events.prev_batch); + isInitialSync = false; + } + nhlog::ui()->info("add {} events", events.events.size()); std::vector<QString> ids; for (const auto &e : events.events) { @@ -83,6 +96,58 @@ TimelineModel::addEvents(const mtx::responses::Timeline &events) endInsertRows(); } +void +TimelineModel::fetchHistory() +{ + if (paginationInProgress) { + nhlog::ui()->warn("Already loading older messages"); + return; + } + + paginationInProgress = true; + mtx::http::MessagesOpts opts; + opts.room_id = room_id_.toStdString(); + opts.from = prev_batch_token_.toStdString(); + + nhlog::ui()->info("Paginationg room {}", opts.room_id); + + http::client()->messages( + opts, [this, opts](const mtx::responses::Messages &res, mtx::http::RequestErr err) { + if (err) { + nhlog::net()->error("failed to call /messages ({}): {} - {}", + opts.room_id, + mtx::errors::to_string(err->matrix_error.errcode), + err->matrix_error.error); + return; + } + + emit oldMessagesRetrieved(std::move(res)); + }); +} + +void +TimelineModel::addBackwardsEvents(const mtx::responses::Messages &msgs) +{ + nhlog::ui()->info("add {} backwards events", msgs.chunk.size()); + std::vector<QString> ids; + for (const auto &e : msgs.chunk) { + QString id = + boost::apply_visitor([](const auto &e) -> QString { return eventId(e); }, e); + + this->events.insert(id, e); + ids.push_back(id); + nhlog::ui()->info("add event {}", id.toStdString()); + } + + beginInsertRows(QModelIndex(), 0, static_cast<int>(ids.size() - 1)); + this->eventOrder.insert(this->eventOrder.begin(), ids.rbegin(), ids.rend()); + endInsertRows(); + + prev_batch_token_ = QString::fromStdString(msgs.end); + + paginationInProgress = false; +} + QColor TimelineModel::userColor(QString id, QColor background) {