Skip to content
Snippets Groups Projects
ManagerWin.cpp 2.91 KiB
Newer Older
  • Learn to ignore specific revisions
  • Nicolas Werner's avatar
    Nicolas Werner committed
    // SPDX-FileCopyrightText: 2021 Nheko Contributors
    //
    // SPDX-License-Identifier: GPL-3.0-or-later
    
    
    #include "notifications/Manager.h"
    
    #include "Cache.h"
    #include "EventAccessors.h"
    #include "MatrixClient.h"
    #include "Utils.h"
    
    #include <mtx/responses/notifications.hpp>
    
    using namespace WinToastLib;
    
    class CustomHandler : public IWinToastHandler
    {
    public:
            void toastActivated() const {}
            void toastActivated(int) const {}
            void toastFailed() const { std::wcout << L"Error showing current toast" << std::endl; }
            void toastDismissed(WinToastDismissalReason) const {}
    };
    
    namespace {
    bool isInitialized = false;
    
    void
    init()
    {
            isInitialized = true;
    
            WinToast::instance()->setAppName(L"Nheko");
            WinToast::instance()->setAppUserModelId(WinToast::configureAUMI(L"nheko", L"nheko"));
            if (!WinToast::instance()->initialize())
    
    Loren Burkholder's avatar
    Loren Burkholder committed
                    std::wcout << "Your system is not compatible with toast notifications\n";
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    NotificationsManager::NotificationsManager(QObject *parent)
      : QObject(parent)
    {}
    
    NotificationsManager::postNotification(const mtx::responses::Notification &notification,
                                           const QImage &icon)
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
            Q_UNUSED(icon)
    
    
            const auto room_name =
              QString::fromStdString(cache::singleRoomInfo(notification.room_id).name);
            const auto sender =
              cache::displayName(QString::fromStdString(notification.room_id),
                                 QString::fromStdString(mtx::accessors::sender(notification.event)));
            const auto text = utils::event_body(notification.event);
    
    
            if (!isInitialized)
                    init();
    
            auto templ = WinToastTemplate(WinToastTemplate::ImageAndText02);
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
            if (room_name != sender)
                    templ.setTextField(QString("%1 - %2").arg(sender).arg(room_name).toStdWString(),
    
                                       WinToastTemplate::FirstLine);
            else
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
                    templ.setTextField(QString("%1").arg(sender).toStdWString(),
    
                                       WinToastTemplate::FirstLine);
    
            if (mtx::accessors::msg_type(notification.event) == mtx::events::MessageType::Emote)
    
                    templ.setTextField(
                      QString("* ").append(sender).append(" ").append(text).toStdWString(),
                      WinToastTemplate::SecondLine);
            else
                    templ.setTextField(QString("%1").arg(text).toStdWString(),
                                       WinToastTemplate::SecondLine);
    
            // TODO: implement room or user avatar
            // templ.setImagePath(L"C:/example.png");
    
            WinToast::instance()->showToast(templ, new CustomHandler());
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    void NotificationsManager::actionInvoked(uint, QString) {}
    
    void NotificationsManager::notificationReplied(uint, QString) {}
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    void NotificationsManager::notificationClosed(uint, uint) {}
    
    Nicolas Werner's avatar
    Nicolas Werner committed
    NotificationsManager::removeNotification(const QString &, const QString &)