summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2020-07-10 01:37:55 +0200
committerNicolas Werner <nicolas.werner@hotmail.de>2020-07-10 01:37:55 +0200
commit3421728898cd12a39d541ae7bedee4f0e58f47b5 (patch)
tree3ff693cda85476b9a82ddaaefc93e4ab1f185507 /src
parentWIP: Event Store split out (diff)
downloadnheko-3421728898cd12a39d541ae7bedee4f0e58f47b5.tar.xz
Fetch missing events
Diffstat (limited to 'src')
-rw-r--r--src/Cache.cpp11
-rw-r--r--src/Cache_p.h3
-rw-r--r--src/timeline/EventStore.cpp37
-rw-r--r--src/timeline/EventStore.h3
-rw-r--r--src/timeline/TimelineModel.cpp21
5 files changed, 52 insertions, 23 deletions
diff --git a/src/Cache.cpp b/src/Cache.cpp

index d2c790dd..173b2c70 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp
@@ -1324,6 +1324,17 @@ Cache::getEvent(const std::string &room_id, const std::string &event_id) return te; } +void +Cache::storeEvent(const std::string &room_id, + const std::string &event_id, + const mtx::events::collections::TimelineEvent &event) +{ + auto txn = lmdb::txn::begin(env_); + auto eventsDb = getEventsDb(txn, room_id); + auto event_json = mtx::accessors::serialize_event(event.data); + lmdb::dbi_put(txn, eventsDb, lmdb::val(event_id), lmdb::val(event_json.dump())); + txn.commit(); +} QMap<QString, RoomInfo> Cache::roomInfo(bool withInvites) diff --git a/src/Cache_p.h b/src/Cache_p.h
index 40c8e98b..6b4b260e 100644 --- a/src/Cache_p.h +++ b/src/Cache_p.h
@@ -185,6 +185,9 @@ public: std::optional<mtx::events::collections::TimelineEvent> getEvent( const std::string &room_id, const std::string &event_id); + void storeEvent(const std::string &room_id, + const std::string &event_id, + const mtx::events::collections::TimelineEvent &event); struct TimelineRange { int64_t first, last; diff --git a/src/timeline/EventStore.cpp b/src/timeline/EventStore.cpp
index eb54d475..719743fb 100644 --- a/src/timeline/EventStore.cpp +++ b/src/timeline/EventStore.cpp
@@ -5,6 +5,7 @@ #include "Cache_p.h" #include "EventAccessors.h" #include "Logging.h" +#include "MatrixClient.h" #include "Olm.h" QCache<EventStore::IdIndex, mtx::events::collections::TimelineEvents> EventStore::decryptedEvents_{ @@ -22,6 +23,23 @@ EventStore::EventStore(std::string room_id, QObject *) this->first = range->first; this->last = range->last; } + + connect( + this, + &EventStore::eventFetched, + this, + [this](std::string id, + std::string relatedTo, + mtx::events::collections::TimelineEvents timeline) { + cache::client()->storeEvent(room_id_, id, {timeline}); + + if (!relatedTo.empty()) { + auto idx = idToIndex(id); + if (idx) + emit dataChanged(*idx, *idx); + } + }, + Qt::QueuedConnection); } void @@ -241,8 +259,23 @@ EventStore::event(std::string_view id, std::string_view related_to, bool decrypt if (!event_ptr) { auto event = cache::client()->getEvent(room_id_, index.id); if (!event) { - // fetch - (void)related_to; + http::client()->get_event( + room_id_, + index.id, + [this, + relatedTo = std::string(related_to.data(), related_to.size()), + id = index.id](const mtx::events::collections::TimelineEvents &timeline, + mtx::http::RequestErr err) { + if (err) { + nhlog::net()->error( + "Failed to retrieve event with id {}, which was " + "requested to show the replyTo for event {}", + relatedTo, + id); + return; + } + emit eventFetched(id, relatedTo, timeline); + }); return nullptr; } event_ptr = new mtx::events::collections::TimelineEvents(std::move(event->data)); diff --git a/src/timeline/EventStore.h b/src/timeline/EventStore.h
index 77d73536..83c8f7a4 100644 --- a/src/timeline/EventStore.h +++ b/src/timeline/EventStore.h
@@ -81,6 +81,9 @@ signals: void endInsertRows(); void dataChanged(int from, int to); void newEncryptedImage(mtx::crypto::EncryptedFile encryptionInfo); + void eventFetched(std::string id, + std::string relatedTo, + mtx::events::collections::TimelineEvents timeline); private: mtx::events::collections::TimelineEvents *decryptEvent( diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 492d4e0a..6df92d7a 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp
@@ -696,27 +696,6 @@ TimelineModel::internalAddEvents( emit dataChanged(index(idx, 0), index(idx, 0)); continue; // don't insert reaction into timeline } - - // auto replyTo = mtx::accessors::in_reply_to_event(e); - // auto qReplyTo = QString::fromStdString(replyTo); - // if (!replyTo.empty() && !events.contains(qReplyTo)) { - // http::client()->get_event( - // this->room_id_.toStdString(), - // replyTo, - // [this, id, replyTo]( - // const mtx::events::collections::TimelineEvents &timeline, - // mtx::http::RequestErr err) { - // if (err) { - // nhlog::net()->error( - // "Failed to retrieve event with id {}, which was " - // "requested to show the replyTo for event {}", - // replyTo, - // id.toStdString()); - // return; - // } - // emit eventFetched(id, timeline); - // }); - //} } }