diff --git a/include/Cache.h b/include/Cache.h
index 0829acf5..1fa6c430 100644
--- a/include/Cache.h
+++ b/include/Cache.h
@@ -233,6 +233,12 @@ public:
std::vector<RoomSearchResult> searchRooms(const std::string &query,
std::uint8_t max_items = 5);
+ void markSentNotification(const std::string &event_id);
+ //! Removes an event from the sent notifications.
+ void removeReadNotification(const std::string &event_id);
+ //! Check if we have sent a desktop notification for the given event id.
+ bool isNotificationSent(const std::string &event_id);
+
private:
//! Save an invited room.
void saveInvite(lmdb::txn &txn,
@@ -422,6 +428,7 @@ private:
lmdb::dbi invitesDb_;
lmdb::dbi mediaDb_;
lmdb::dbi readReceiptsDb_;
+ lmdb::dbi notificationsDb_;
QString localUserId_;
QString cacheDirectory_;
diff --git a/include/ChatPage.h b/include/ChatPage.h
index 147ff6b2..f659163c 100644
--- a/include/ChatPage.h
+++ b/include/ChatPage.h
@@ -136,6 +136,8 @@ private:
//! Update the room with the new notification count.
void updateRoomNotificationCount(const QString &room_id, uint16_t notification_count);
+ //! Send desktop notification for the received messages.
+ void sendDesktopNotifications(const mtx::responses::Notifications &);
QStringList generateTypingUsers(const QString &room_id,
const std::vector<std::string> &typing_users);
diff --git a/include/MatrixClient.h b/include/MatrixClient.h
index 1be15e56..35f05c31 100644
--- a/include/MatrixClient.h
+++ b/include/MatrixClient.h
@@ -91,6 +91,7 @@ public:
void redactEvent(const QString &room_id, const QString &event_id);
void inviteUser(const QString &room_id, const QString &user);
void createRoom(const mtx::requests::CreateRoom &request);
+ void getNotifications() noexcept;
QUrl getHomeServer() { return server_; };
int transactionId() { return txn_id_; };
@@ -178,6 +179,7 @@ signals:
void redactionCompleted(const QString &room_id, const QString &event_id);
void invalidToken();
void syncError(const QString &error);
+ void notificationsRetrieved(const mtx::responses::Notifications ¬ifications);
private:
QNetworkReply *makeUploadRequest(QSharedPointer<QIODevice> iodev);
diff --git a/include/Utils.h b/include/Utils.h
index c9dc460a..6fea4962 100644
--- a/include/Utils.h
+++ b/include/Utils.h
@@ -32,6 +32,9 @@ firstChar(const QString &input);
QString
humanReadableFileSize(uint64_t bytes);
+QString
+event_body(const mtx::events::collections::TimelineEvents &event);
+
//! Match widgets/events with a description message.
template<class T>
QString
@@ -131,6 +134,37 @@ erase_if(ContainerT &items, const PredicateT &predicate)
}
}
+inline mtx::events::EventType
+event_type(const mtx::events::collections::TimelineEvents &event)
+{
+ return mpark::visit([](auto msg) { return msg.type; }, event);
+}
+
+inline std::string
+event_id(const mtx::events::collections::TimelineEvents &event)
+{
+ return mpark::visit([](auto msg) { return msg.event_id; }, event);
+}
+
+inline QString
+eventId(const mtx::events::collections::TimelineEvents &event)
+{
+ return QString::fromStdString(event_id(event));
+}
+
+inline QString
+event_sender(const mtx::events::collections::TimelineEvents &event)
+{
+ return mpark::visit([](auto msg) { return QString::fromStdString(msg.sender); }, event);
+}
+
+template<class T>
+QString
+message_body(const mtx::events::collections::TimelineEvents &event)
+{
+ return QString::fromStdString(mpark::get<T>(event).content.body);
+}
+
//! Calculate the Levenshtein distance between two strings with character skipping.
int
levenshtein_distance(const std::string &s1, const std::string &s2);
diff --git a/include/timeline/TimelineView.h b/include/timeline/TimelineView.h
index ab4fbd47..02e2872a 100644
--- a/include/timeline/TimelineView.h
+++ b/include/timeline/TimelineView.h
@@ -211,9 +211,6 @@ private:
bool isScrollbarActivated() { return scroll_area_->verticalScrollBar()->value() != 0; }
//! Retrieve the event id of the last item.
QString getLastEventId() const;
- QString getEventSender(const mtx::events::collections::TimelineEvents &event) const;
- mtx::events::EventType getEventType(
- const mtx::events::collections::TimelineEvents &event) const;
template<class Event, class Widget>
TimelineItem *processMessageEvent(const Event &event, TimelineDirection direction);
|