mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-25 20:48:52 +03:00
Implement desktop notification for mac
This commit is contained in:
parent
ed9501023a
commit
506cf68072
8 changed files with 107 additions and 7 deletions
|
@ -24,8 +24,8 @@ fix_project_version()
|
||||||
|
|
||||||
# Set additional project information
|
# Set additional project information
|
||||||
set(COMPANY "Nheko")
|
set(COMPANY "Nheko")
|
||||||
set(COPYRIGHT "Copyright (c) 2017 Mujx")
|
set(COPYRIGHT "Copyright (c) 2017 Nheko Contributors")
|
||||||
set(IDENTIFIER "com.mujx.nheko")
|
set(IDENTIFIER "com.github.mujx.nheko")
|
||||||
|
|
||||||
add_project_meta(META_FILES_TO_INCLUDE)
|
add_project_meta(META_FILES_TO_INCLUDE)
|
||||||
|
|
||||||
|
@ -305,6 +305,15 @@ else()
|
||||||
set(NHEKO_LIBS ${COMMON_LIBS} ${LMDB_LIBRARY})
|
set(NHEKO_LIBS ${COMMON_LIBS} ${LMDB_LIBRARY})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (APPLE)
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework Foundation")
|
||||||
|
set(SRC_FILES ${SRC_FILES} src/notifications/ManagerMac.mm)
|
||||||
|
elseif (WIN32)
|
||||||
|
set(SRC_FILES ${SRC_FILES} src/notifications/ManagerWin.cpp)
|
||||||
|
else ()
|
||||||
|
set(SRC_FILES ${SRC_FILES} src/notifications/ManagerLinux.cpp)
|
||||||
|
endif ()
|
||||||
|
|
||||||
set(NHEKO_DEPS
|
set(NHEKO_DEPS
|
||||||
${SRC_FILES}
|
${SRC_FILES}
|
||||||
${UI_HEADERS}
|
${UI_HEADERS}
|
||||||
|
|
|
@ -196,6 +196,7 @@ public:
|
||||||
|
|
||||||
//! Retrieves the saved room avatar.
|
//! Retrieves the saved room avatar.
|
||||||
QImage getRoomAvatar(const QString &id);
|
QImage getRoomAvatar(const QString &id);
|
||||||
|
QImage getRoomAvatar(const std::string &id);
|
||||||
|
|
||||||
//! Adds a user to the read list for the given event.
|
//! Adds a user to the read list for the given event.
|
||||||
//!
|
//!
|
||||||
|
@ -220,6 +221,7 @@ public:
|
||||||
}
|
}
|
||||||
void saveImage(const QString &url, const QByteArray &data);
|
void saveImage(const QString &url, const QByteArray &data);
|
||||||
|
|
||||||
|
RoomInfo singleRoomInfo(const std::string &room_id);
|
||||||
std::vector<std::string> roomsWithStateUpdates(const mtx::responses::Sync &res);
|
std::vector<std::string> roomsWithStateUpdates(const mtx::responses::Sync &res);
|
||||||
std::map<QString, RoomInfo> getRoomInfo(const std::vector<std::string> &rooms);
|
std::map<QString, RoomInfo> getRoomInfo(const std::vector<std::string> &rooms);
|
||||||
std::map<QString, RoomInfo> roomUpdates(const mtx::responses::Sync &sync)
|
std::map<QString, RoomInfo> roomUpdates(const mtx::responses::Sync &sync)
|
||||||
|
|
12
include/notifications/Manager.h
Normal file
12
include/notifications/Manager.h
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QImage>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class NotificationsManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void postNotification(const QString &room,
|
||||||
|
const QString &user,
|
||||||
|
const QString &message);
|
||||||
|
};
|
36
src/Cache.cc
36
src/Cache.cc
|
@ -528,6 +528,34 @@ Cache::roomsWithStateUpdates(const mtx::responses::Sync &res)
|
||||||
return rooms;
|
return rooms;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RoomInfo
|
||||||
|
Cache::singleRoomInfo(const std::string &room_id)
|
||||||
|
{
|
||||||
|
auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
|
||||||
|
|
||||||
|
lmdb::val data;
|
||||||
|
|
||||||
|
// Check if the room is joined.
|
||||||
|
if (lmdb::dbi_get(txn, roomsDb_, lmdb::val(room_id), data)) {
|
||||||
|
try {
|
||||||
|
RoomInfo tmp = json::parse(std::string(data.data(), data.size()));
|
||||||
|
tmp.member_count = getMembersDb(txn, room_id).size(txn);
|
||||||
|
|
||||||
|
txn.commit();
|
||||||
|
|
||||||
|
return tmp;
|
||||||
|
} catch (const json::exception &e) {
|
||||||
|
qWarning()
|
||||||
|
<< "failed to parse room info:" << QString::fromStdString(room_id)
|
||||||
|
<< QString::fromStdString(std::string(data.data(), data.size()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
txn.commit();
|
||||||
|
|
||||||
|
return RoomInfo();
|
||||||
|
}
|
||||||
|
|
||||||
std::map<QString, RoomInfo>
|
std::map<QString, RoomInfo>
|
||||||
Cache::getRoomInfo(const std::vector<std::string> &rooms)
|
Cache::getRoomInfo(const std::vector<std::string> &rooms)
|
||||||
{
|
{
|
||||||
|
@ -892,12 +920,18 @@ Cache::getInviteRoomTopic(lmdb::txn &txn, lmdb::dbi &db)
|
||||||
|
|
||||||
QImage
|
QImage
|
||||||
Cache::getRoomAvatar(const QString &room_id)
|
Cache::getRoomAvatar(const QString &room_id)
|
||||||
|
{
|
||||||
|
return getRoomAvatar(room_id.toStdString());
|
||||||
|
}
|
||||||
|
|
||||||
|
QImage
|
||||||
|
Cache::getRoomAvatar(const std::string &room_id)
|
||||||
{
|
{
|
||||||
auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
|
auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
|
||||||
|
|
||||||
lmdb::val response;
|
lmdb::val response;
|
||||||
|
|
||||||
if (!lmdb::dbi_get(txn, roomsDb_, lmdb::val(room_id.toStdString()), response)) {
|
if (!lmdb::dbi_get(txn, roomsDb_, lmdb::val(room_id), response)) {
|
||||||
txn.commit();
|
txn.commit();
|
||||||
return QImage();
|
return QImage();
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
#include "UserSettingsPage.h"
|
#include "UserSettingsPage.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
|
|
||||||
|
#include "notifications/Manager.h"
|
||||||
|
|
||||||
#include "dialogs/ReadReceipts.h"
|
#include "dialogs/ReadReceipts.h"
|
||||||
#include "timeline/TimelineViewManager.h"
|
#include "timeline/TimelineViewManager.h"
|
||||||
|
|
||||||
|
@ -864,12 +866,17 @@ ChatPage::sendDesktopNotifications(const mtx::responses::Notifications &res)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cache_->isNotificationSent(event_id)) {
|
if (!cache_->isNotificationSent(event_id)) {
|
||||||
// TODO: send desktop notification
|
const auto room_id = QString::fromStdString(item.room_id);
|
||||||
// qDebug() << "sender" << utils::event_sender(item.event);
|
const auto user_id = utils::event_sender(item.event);
|
||||||
// qDebug() << "body" << utils::event_body(item.event);
|
const auto body = utils::event_body(item.event);
|
||||||
|
|
||||||
// We should only sent one notification per event.
|
// We should only sent one notification per event.
|
||||||
// cache_->markSentNotification(event_id);
|
cache_->markSentNotification(event_id);
|
||||||
|
|
||||||
|
NotificationsManager::postNotification(
|
||||||
|
QString::fromStdString(cache_->singleRoomInfo(item.room_id).name),
|
||||||
|
Cache::displayName(room_id, user_id),
|
||||||
|
body);
|
||||||
}
|
}
|
||||||
} catch (const lmdb::error &e) {
|
} catch (const lmdb::error &e) {
|
||||||
qWarning() << e.what();
|
qWarning() << e.what();
|
||||||
|
|
7
src/notifications/ManagerLinux.cpp
Normal file
7
src/notifications/ManagerLinux.cpp
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#include "notifications/Manager.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
NotificationsManager::postNotification(const QString &, const QString &, const QString &)
|
||||||
|
{
|
||||||
|
// TODO: To be implemented
|
||||||
|
}
|
22
src/notifications/ManagerMac.mm
Normal file
22
src/notifications/ManagerMac.mm
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
#include "notifications/Manager.h"
|
||||||
|
|
||||||
|
#include <Foundation/Foundation.h>
|
||||||
|
#include <QtMac>
|
||||||
|
|
||||||
|
@interface NSUserNotification (CFIPrivate)
|
||||||
|
- (void)set_identityImage:(NSImage *)image;
|
||||||
|
@end
|
||||||
|
|
||||||
|
void
|
||||||
|
NotificationsManager::postNotification(const QString &roomName, const QString &userName, const QString &message)
|
||||||
|
{
|
||||||
|
NSUserNotification * notif = [[NSUserNotification alloc] init];
|
||||||
|
|
||||||
|
notif.title = roomName.toNSString();
|
||||||
|
notif.subtitle = QString("%1 sent a message").arg(userName).toNSString();
|
||||||
|
notif.informativeText = message.toNSString();
|
||||||
|
notif.soundName = NSUserNotificationDefaultSoundName;
|
||||||
|
|
||||||
|
[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification: notif];
|
||||||
|
[notif autorelease];
|
||||||
|
}
|
7
src/notifications/ManagerWin.cpp
Normal file
7
src/notifications/ManagerWin.cpp
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#include "notifications/Manager.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
NotificationsManager::postNotification(const QString &, const QString &, const QString &)
|
||||||
|
{
|
||||||
|
// TODO: To be implemented
|
||||||
|
}
|
Loading…
Reference in a new issue