From dbdaf35907842f5585f832957d731d9b74e6f25d Mon Sep 17 00:00:00 2001
From: Joseph Donofry <joedonofry@gmail.com>
Date: Mon, 5 Aug 2019 23:00:07 -0400
Subject: [PATCH] Cache user mentions

---
 deps/CMakeLists.txt |  4 ++--
 src/Cache.cpp       | 55 +++++++++++++++++++++++++++++++++++++++++++++
 src/Cache.h         | 12 ++++++++++
 3 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt
index dbc964634..3de6cbf85 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 56c79678b..7b688ac7f 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 65c5263d8..4d675721d 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.
         //!
-- 
GitLab