diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index dbc96463..3de6cbf8 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -46,10 +46,10 @@ set(BOOST_SHA256 set( MTXCLIENT_URL - https://github.com/Nheko-Reborn/mtxclient/archive/37df82363c800b8d6b2b172a486e395e4132e061.tar.gz + https://github.com/Nheko-Reborn/mtxclient/archive/b56083dfa95848c39d9290efdc5544ac07030028.tar.gz ) set(MTXCLIENT_HASH - b29dd0bc836b69bd4253499519b8396a210bba43750fb66f4ffb8453510c8dd1) + 486feb1ee9ad5fe2295fa27baaa6c67c9d90cece2435eed19be2630d59552e20) set( TWEENY_URL https://github.com/mobius3/tweeny/archive/b94ce07cfb02a0eb8ac8aaf66137dabdaea857cf.tar.gz diff --git a/src/Cache.cpp b/src/Cache.cpp index 56c79678..7b688ac7 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -1934,6 +1934,61 @@ Cache::saveTimelineMessages(lmdb::txn &txn, lmdb::val(obj.dump())); } } +mtx::responses::Notifications +Cache::getTimelineMentions(lmdb::txn &txn, const std::string &room_id) +{ + auto db = getMentionsDb(txn, room_id); + + mtx::responses::Notifications notif; + std::string event_id, msg; + + auto cursor = lmdb::cursor::open(txn, db); + + while (cursor.get(event_id, msg, MDB_NEXT)) { + auto obj = json::parse(msg); + + if (obj.count("event") == 0 || obj.count("token") == 0) + continue; + + mtx::responses::Notification notification; + mtx::responses::from_json(obj.at("notification"), notification); + + notif.notifications.push_back(notification); + } + cursor.close(); + + std::reverse(notif.notifications.begin(), notif.notifications.end()); + + return notif; +} +void +Cache::saveTimelineMentions(lmdb::txn &txn, + const std::string &room_id, + const mtx::responses::Notifications &res) +{ + auto db = getMentionsDb(txn, room_id); + + using namespace mtx::events; + using namespace mtx::events::state; + + for (const auto &n : res.notifications) { + + const auto event_id = utils::event_id(n.event); + + // double check that we have the correct room_id... + if (room_id.compare(n.room_id) != 0) + continue; + + json obj = json::object(); + + lmdb::dbi_put(txn, + db, + lmdb::val(event_id), + lmdb::val(obj.dump())); + } + + txn.commit(); +} void Cache::markSentNotification(const std::string &event_id) diff --git a/src/Cache.h b/src/Cache.h index 65c5263d..4d675721 100644 --- a/src/Cache.h +++ b/src/Cache.h @@ -402,6 +402,13 @@ public: //! Check if we have sent a desktop notification for the given event id. bool isNotificationSent(const std::string &event_id); + //! Add a notification containing a user mention to the db. + void saveTimelineMentions(lmdb::txn &txn, + const std::string &room_id, + const mtx::responses::Notifications &res); + //! Get timeline items that a user was mentions in + mtx::responses::Notifications getTimelineMentions(lmdb::txn &txn, const std::string &room_id); + //! Remove old unused data. void deleteOldMessages(); void deleteOldData() noexcept; @@ -660,6 +667,11 @@ private: return lmdb::dbi::open(txn, std::string(room_id + "/members").c_str(), MDB_CREATE); } + lmdb::dbi getMentionsDb(lmdb::txn &txn, const std::string &room_id) + { + return lmdb::dbi::open(txn, std::string(room_id + "/mentions").c_str(), MDB_CREATE); + } + //! Retrieves or creates the database that stores the open OLM sessions between our device //! and the given curve25519 key which represents another device. //!