summary refs log tree commit diff
path: root/src/notifications/ManagerWin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/notifications/ManagerWin.cpp')
-rw-r--r--src/notifications/ManagerWin.cpp52
1 files changed, 45 insertions, 7 deletions
diff --git a/src/notifications/ManagerWin.cpp b/src/notifications/ManagerWin.cpp
index 8d200abc..f1d3797b 100644
--- a/src/notifications/ManagerWin.cpp
+++ b/src/notifications/ManagerWin.cpp
@@ -13,6 +13,7 @@
 
 #include "Cache.h"
 #include "EventAccessors.h"
+#include "MxcImageProvider.h"
 #include "Utils.h"
 
 using namespace WinToastLib;
@@ -20,10 +21,21 @@ using namespace WinToastLib;
 class CustomHandler : public IWinToastHandler
 {
 public:
-    void toastActivated() const {}
+    CustomHandler(NotificationsManager *manager_, const QString &roomid_, const QString &eventid_)
+      : manager(manager_)
+      , roomid(roomid_)
+      , eventid(eventid_)
+    {
+    }
+
+    void toastActivated() const { manager->notificationClicked(roomid, eventid); }
     void toastActivated(int) const {}
     void toastFailed() const { std::wcout << L"Error showing current toast" << std::endl; }
     void toastDismissed(WinToastDismissalReason) const {}
+
+    NotificationsManager *manager;
+    QString roomid;
+    QString eventid;
 };
 
 namespace {
@@ -34,9 +46,9 @@ init()
 {
     isInitialized = true;
 
-    WinToast::instance()->setAppName(L"Nheko");
     WinToast::instance()->setAppUserModelId(
       WinToast::configureAUMI(L"NhekoReborn", L"in.nheko.Nheko"));
+    WinToast::instance()->setAppName(L"Nheko");
     if (!WinToast::instance()->initialize())
         std::wcout << "Your system is not compatible with toast notifications\n";
 }
@@ -52,6 +64,8 @@ NotificationsManager::postNotification(const mtx::responses::Notification &notif
                                        const QImage &icon)
 {
     const auto room_name = QString::fromStdString(cache::singleRoomInfo(notification.room_id).name);
+    auto roomid          = QString::fromStdString(notification.room_id);
+    auto eventid         = QString::fromStdString(mtx::accessors::event_id(notification.event));
 
     auto formatNotification = [this, notification] {
         const auto template_ = getMessageTemplate(notification);
@@ -61,20 +75,40 @@ NotificationsManager::postNotification(const mtx::responses::Notification &notif
         }
 
         return template_.arg(utils::stripReplyFallbacks(notification.event, {}, {}).quoted_body);
-    };
+    }();
 
     auto iconPath = QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + room_name +
                     "-room-avatar.png";
     if (!icon.save(iconPath))
         iconPath.clear();
 
-    systemPostNotification(room_name, formatNotification(), iconPath);
+    if (mtx::accessors::msg_type(notification.event) == mtx::events::MessageType::Image ||
+        mtx::accessors::msg_type(notification.event) == mtx::events::MessageType::Image) {
+        MxcImageProvider::download(
+          QString::fromStdString(mtx::accessors::url(notification.event))
+            .remove(QStringLiteral("mxc://")),
+          QSize(200, 80),
+          [this, roomid, eventid, room_name, formatNotification, iconPath](
+            QString, QSize, QImage, QString imgPath) {
+              if (imgPath.isEmpty())
+                  systemPostNotification(
+                    roomid, eventid, room_name, formatNotification, iconPath, "");
+              else
+                  systemPostNotification(
+                    roomid, eventid, room_name, formatNotification, iconPath, imgPath);
+          });
+    } else {
+        systemPostNotification(roomid, eventid, room_name, formatNotification, iconPath, "");
+    }
 }
 
 void
-NotificationsManager::systemPostNotification(const QString &line1,
+NotificationsManager::systemPostNotification(const QString &roomid,
+                                             const QString &eventid,
+                                             const QString &line1,
                                              const QString &line2,
-                                             const QString &iconPath)
+                                             const QString &iconPath,
+                                             const QString &bodyImagePath)
 {
     if (!isInitialized)
         init();
@@ -85,8 +119,12 @@ NotificationsManager::systemPostNotification(const QString &line1,
 
     if (!iconPath.isNull())
         templ.setImagePath(iconPath.toStdWString());
+    if (!bodyImagePath.isNull())
+        templ.setHeroImagePath(bodyImagePath.toStdWString(), true);
+
+    templ.setAudioPath(WinToastTemplate::IM);
 
-    WinToast::instance()->showToast(templ, new CustomHandler());
+    WinToast::instance()->showToast(templ, new CustomHandler(this, roomid, eventid));
 }
 
 // clang-format off