diff options
author | Nicolas Werner <nicolas.werner@hotmail.de> | 2023-05-29 00:42:56 +0200 |
---|---|---|
committer | Nicolas Werner <nicolas.werner@hotmail.de> | 2023-05-29 00:42:56 +0200 |
commit | 3f4d38422074eec4c77ef06b3d1117966a621659 (patch) | |
tree | 91019a84c680e39e65b25cbfa4424db0706c06f8 | |
parent | Merge pull request #1465 from frlan/patch-1 (diff) | |
parent | Do not display reply action in the recap notif on Mac (diff) | |
download | nheko-3f4d38422074eec4c77ef06b3d1117966a621659.tar.xz |
Merge branch 'dont-send-notifications-on-first-sync' of github.com:LcsTen/nheko into notif-test
-rw-r--r-- | src/ChatPage.cpp | 58 | ||||
-rw-r--r-- | src/notifications/ManagerLinux.cpp | 13 | ||||
-rw-r--r-- | src/notifications/ManagerMac.mm | 16 |
3 files changed, 60 insertions, 27 deletions
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> userSettings, QObject *parent) if (pushrules) { const auto local_user = utils::localUser().toStdString(); + // Desktop notifications to be sent + std::vector<std::tuple<QSharedPointer<TimelineModel>, + mtx::events::collections::TimelineEvents, + std::string, + std::vector<mtx::pushrules::actions::Action>>> + 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> 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<QSharedPointer<TimelineModel>, 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}; diff --git a/src/notifications/ManagerMac.mm b/src/notifications/ManagerMac.mm index 39312465..6da5d006 100644 --- a/src/notifications/ManagerMac.mm +++ b/src/notifications/ManagerMac.mm @@ -106,10 +106,18 @@ void NotificationsManager::objCxxPostNotification( textInputButtonTitle:sendStr.toNSString() textInputPlaceholder:placeholder.toNSString()]; - UNNotificationCategory* category = [UNNotificationCategory categoryWithIdentifier:@"ReplyCategory" - actions:@[ replyAction ] - intentIdentifiers:@[] - options:UNNotificationCategoryOptionNone]; + UNNotificationCategory* category; + if(!room_id.isEmpty()){ + category = [UNNotificationCategory categoryWithIdentifier:@"ReplyCategory" + actions:@[ replyAction ] + intentIdentifiers:@[] + options:UNNotificationCategoryOptionNone]; + }else{ + category = [UNNotificationCategory categoryWithIdentifier:@"ReplyCategory" + actions:@[] + intentIdentifiers:@[] + options:UNNotificationCategoryOptionNone]; + } NSString* title = room_name.toNSString(); NSString* sub = subtitle.toNSString(); |