Files
NodeBB/src/messaging/notifications.js

84 lines
2.5 KiB
JavaScript
Raw Normal View History

2015-12-16 11:15:43 +02:00
'use strict';
const winston = require('winston');
2020-09-28 11:18:43 -04:00
const user = require('../user');
const notifications = require('../notifications');
const sockets = require('../socket.io');
const plugins = require('../plugins');
const meta = require('../meta');
2015-12-16 11:15:43 +02:00
module.exports = function (Messaging) {
2021-11-18 16:42:18 -05:00
Messaging.notifyQueue = {}; // Only used to notify a user of a new chat message, see Messaging.notifyUser
2015-12-16 11:30:10 +02:00
Messaging.notifyUsersInRoom = async (fromUid, roomId, messageObj) => {
let uids = await Messaging.getUidsInRoom(roomId, 0, -1);
uids = await user.blocks.filterUids(fromUid, uids);
2017-04-26 10:45:40 -06:00
let data = {
roomId: roomId,
fromUid: fromUid,
message: messageObj,
uids: uids,
};
data = await plugins.hooks.fire('filter:messaging.notify', data);
if (!data || !data.uids || !data.uids.length) {
return;
}
2017-04-26 10:45:40 -06:00
uids = data.uids;
2021-02-04 00:01:39 -07:00
uids.forEach((uid) => {
data.self = parseInt(uid, 10) === parseInt(fromUid, 10) ? 1 : 0;
Messaging.pushUnreadCount(uid);
2021-02-03 23:59:08 -07:00
sockets.in(`uid_${uid}`).emit('event:chats.receive', data);
});
if (messageObj.system) {
return;
}
// Delayed notifications
2021-02-03 23:59:08 -07:00
let queueObj = Messaging.notifyQueue[`${fromUid}:${roomId}`];
if (queueObj) {
2021-02-03 23:59:08 -07:00
queueObj.message.content += `\n${messageObj.content}`;
clearTimeout(queueObj.timeout);
} else {
queueObj = {
message: messageObj,
};
2021-02-03 23:59:08 -07:00
Messaging.notifyQueue[`${fromUid}:${roomId}`] = queueObj;
}
2015-12-16 11:15:43 +02:00
queueObj.timeout = setTimeout(async () => {
try {
await sendNotifications(fromUid, uids, roomId, queueObj.message);
} catch (err) {
winston.error(`[messaging/notifications] Unabled to send notification\n${err.stack}`);
}
2021-06-21 11:17:57 -04:00
}, meta.config.notificationSendDelay * 1000);
2017-02-22 13:34:57 +03:00
};
2015-12-16 11:15:43 +02:00
async function sendNotifications(fromuid, uids, roomId, messageObj) {
const hasRead = await Messaging.hasRead(uids, roomId);
uids = uids.filter((uid, index) => !hasRead[index] && parseInt(fromuid, 10) !== parseInt(uid, 10));
if (!uids.length) {
2023-03-26 20:11:11 -04:00
delete Messaging.notifyQueue[`${fromuid}:${roomId}`];
return;
}
2015-12-16 11:15:43 +02:00
const { displayname } = messageObj.fromUser;
const isGroupChat = await Messaging.isGroupChat(roomId);
const notification = await notifications.create({
type: isGroupChat ? 'new-group-chat' : 'new-chat',
subject: `[[email:notif.chat.subject, ${displayname}]]`,
bodyShort: `[[notifications:new_message_from, ${displayname}]]`,
bodyLong: messageObj.content,
2021-02-03 23:59:08 -07:00
nid: `chat_${fromuid}_${roomId}`,
from: fromuid,
2021-02-03 23:59:08 -07:00
path: `/chats/${messageObj.roomId}`,
2015-12-16 11:15:43 +02:00
});
2021-02-03 23:59:08 -07:00
delete Messaging.notifyQueue[`${fromuid}:${roomId}`];
2019-08-19 11:07:59 -04:00
notifications.push(notification, uids);
2015-12-16 11:15:43 +02:00
}
2017-02-18 02:30:48 -07:00
};