Cache user mentions

This commit is contained in:
Joseph Donofry 2019-08-05 23:00:07 -04:00
parent eb2f444c37
commit dbdaf35907
No known key found for this signature in database
GPG key ID: E8A1D78EF044B0CB
3 changed files with 69 additions and 2 deletions

4
deps/CMakeLists.txt vendored
View file

@ -46,10 +46,10 @@ set(BOOST_SHA256
set( set(
MTXCLIENT_URL 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 set(MTXCLIENT_HASH
b29dd0bc836b69bd4253499519b8396a210bba43750fb66f4ffb8453510c8dd1) 486feb1ee9ad5fe2295fa27baaa6c67c9d90cece2435eed19be2630d59552e20)
set( set(
TWEENY_URL TWEENY_URL
https://github.com/mobius3/tweeny/archive/b94ce07cfb02a0eb8ac8aaf66137dabdaea857cf.tar.gz https://github.com/mobius3/tweeny/archive/b94ce07cfb02a0eb8ac8aaf66137dabdaea857cf.tar.gz

View file

@ -1934,6 +1934,61 @@ Cache::saveTimelineMessages(lmdb::txn &txn,
lmdb::val(obj.dump())); 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 void
Cache::markSentNotification(const std::string &event_id) Cache::markSentNotification(const std::string &event_id)

View file

@ -402,6 +402,13 @@ public:
//! Check if we have sent a desktop notification for the given event id. //! Check if we have sent a desktop notification for the given event id.
bool isNotificationSent(const std::string &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. //! Remove old unused data.
void deleteOldMessages(); void deleteOldMessages();
void deleteOldData() noexcept; void deleteOldData() noexcept;
@ -660,6 +667,11 @@ private:
return lmdb::dbi::open(txn, std::string(room_id + "/members").c_str(), MDB_CREATE); 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 //! Retrieves or creates the database that stores the open OLM sessions between our device
//! and the given curve25519 key which represents another device. //! and the given curve25519 key which represents another device.
//! //!