From 818e20513433a38d0104cbc13c68bff5394f505c Mon Sep 17 00:00:00 2001 From: LcsTen Date: Sun, 12 Mar 2023 10:35:25 +0100 Subject: Don't send desktop notifications if there are too many of them at once --- src/ChatPage.cpp | 58 ++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 18 deletions(-) (limited to 'src/ChatPage.cpp') diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp index 4e0d373c..495aa3c3 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp @@ -215,6 +215,12 @@ ChatPage::ChatPage(QSharedPointer userSettings, QObject *parent) if (pushrules) { const auto local_user = utils::localUser().toStdString(); + // Desktop notifications to be sent + std::vector, + mtx::events::collections::TimelineEvents, + std::string, + std::vector>> + notifications; for (const auto &[room_id, room] : sync.rooms.join) { // clear old notifications for (const auto &e : room.ephemeral.events) { @@ -334,30 +340,46 @@ ChatPage::ChatPage(QSharedPointer userSettings, QObject *parent) continue; if (userSettings_->hasDesktopNotifications()) { - auto info = cache::singleRoomInfo(room_id); - - AvatarProvider::resolve( - roomModel->roomAvatarUrl(), - 96, - this, - [this, te, room_id = room_id, actions](QPixmap image) { - notificationsManager->postNotification( - mtx::responses::Notification{ - .actions = actions, - .event = std::move(te), - .read = false, - .profile_tag = "", - .room_id = room_id, - .ts = 0, - }, - image.toImage()); - }); + notifications.emplace_back(roomModel, te, room_id, actions); } } } } } } + if (notifications.size() <= 5) { + for (const auto &[roomModel, te, room_id, actions] : notifications) { + AvatarProvider::resolve( + roomModel->roomAvatarUrl(), + 96, + this, + [this, te = te, room_id = room_id, actions = actions](QPixmap image) { + notificationsManager->postNotification( + mtx::responses::Notification{ + .actions = actions, + .event = std::move(te), + .read = false, + .profile_tag = "", + .room_id = room_id, + .ts = 0, + }, + image.toImage()); + }); + } + } else if (!notifications.empty()) { + std::map, std::size_t> missedEvents; + for (const auto &[roomModel, te, room_id, actions] : notifications) { + missedEvents[roomModel]++; + } + QString body; + for (const auto &[roomModel, nbNotifs] : missedEvents) { + body += tr("%1 unread messages in room %2\n") + .arg(nbNotifs) + .arg(roomModel->roomName()); + } + emit notificationsManager->systemPostNotificationCb( + "", "", "New messages while away", body, QImage()); + } } }); -- cgit 1.5.1