summary refs log tree commit diff
path: root/include/Cache.h
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2018-01-03 18:05:49 +0200
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2018-01-03 18:06:29 +0200
commiteaf05748ff1fc2b1ced8fdb329661ff20d6b7b85 (patch)
tree4d2f190f9662581f7ff8a1e95b146ba225e0a8a6 /include/Cache.h
parentAdd Alpine Linux installation instructions (#191) (diff)
downloadnheko-eaf05748ff1fc2b1ced8fdb329661ff20d6b7b85.tar.xz
Initial support for read receipts
Diffstat (limited to 'include/Cache.h')
-rw-r--r--include/Cache.h55
1 files changed, 55 insertions, 0 deletions
diff --git a/include/Cache.h b/include/Cache.h

index 1f6c59f0..ae58e418 100644 --- a/include/Cache.h +++ b/include/Cache.h
@@ -18,11 +18,52 @@ #pragma once #include <QDir> +#include <json.hpp> #include <lmdb++.h> #include <mtx/responses.hpp> class RoomState; +//! Used to uniquely identify a list of read receipts. +struct ReadReceiptKey +{ + std::string event_id; + std::string room_id; +}; + +inline void +to_json(json &j, const ReadReceiptKey &key) +{ + j = json{{"event_id", key.event_id}, {"room_id", key.room_id}}; +} + +inline void +from_json(const json &j, ReadReceiptKey &key) +{ + key.event_id = j.at("event_id").get<std::string>(); + key.room_id = j.at("room_id").get<std::string>(); +} + +//! Decribes a read receipt stored in cache. +struct ReadReceiptValue +{ + std::string user_id; + uint64_t ts; +}; + +inline void +to_json(json &j, const ReadReceiptValue &value) +{ + j = json{{"user_id", value.user_id}, {"ts", value.ts}}; +} + +inline void +from_json(const json &j, ReadReceiptValue &value) +{ + value.user_id = j.at("user_id").get<std::string>(); + value.ts = j.at("ts").get<uint64_t>(); +} + class Cache { public: @@ -48,6 +89,19 @@ public: bool isFormatValid(); void setCurrentFormat(); + //! Adds a user to the read list for the given event. + //! + //! There should be only one user id present in a receipt list per room. + //! The user id should be removed from any other lists. + using Receipts = std::map<std::string, std::map<std::string, uint64_t>>; + void updateReadReceipt(const std::string &room_id, const Receipts &receipts); + + //! Retrieve all the read receipts for the given event id and room. + //! + //! Returns a map of user ids and the time of the read receipt in milliseconds. + using UserReceipts = std::multimap<uint64_t, std::string>; + UserReceipts readReceipts(const QString &event_id, const QString &room_id); + QByteArray image(const QString &url) const; void saveImage(const QString &url, const QByteArray &data); @@ -60,6 +114,7 @@ private: lmdb::dbi roomDb_; lmdb::dbi invitesDb_; lmdb::dbi imagesDb_; + lmdb::dbi readReceiptsDb_; bool isMounted_;