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()); + } } }); diff --git a/src/notifications/ManagerLinux.cpp b/src/notifications/ManagerLinux.cpp index 6babb447..fc92c9ae 100644 --- a/src/notifications/ManagerLinux.cpp +++ b/src/notifications/ManagerLinux.cpp @@ -187,11 +187,14 @@ NotificationsManager::systemPostNotification(const QString &room_id, // The list of actions has always the action name and then a localized version of that // action. Currently we just use an empty string for that. // TODO(Nico): Look into what to actually put there. - argumentList << (QStringList(QStringLiteral("default")) - << QLatin1String("") << QStringLiteral("inline-reply") - << QLatin1String("")); // actions - argumentList << hints; // hints - argumentList << (int)-1; // timeout in ms + QStringList actions; + actions << QStringList(QStringLiteral("default")) << QLatin1String(""); + if (!room_id.isEmpty()) { + actions << QStringLiteral("inline-reply") << QLatin1String(""); + } + argumentList << actions; // actions + argumentList << hints; // hints + argumentList << (int)-1; // timeout in ms QDBusPendingCall call = dbus.asyncCallWithArgumentList(QStringLiteral("Notify"), argumentList); auto watcher = new QDBusPendingCallWatcher{call, this};