2015-12-16 11:15:43 +02:00
|
|
|
'use strict';
|
|
|
|
|
|
2022-01-19 20:52:12 -05:00
|
|
|
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
|
|
|
|
2016-10-13 11:43:39 +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
|
|
|
|
2019-07-22 11:18:13 -04: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
|
|
|
|
2019-07-22 11:18:13 -04:00
|
|
|
let data = {
|
|
|
|
|
roomId: roomId,
|
|
|
|
|
fromUid: fromUid,
|
|
|
|
|
message: messageObj,
|
|
|
|
|
uids: uids,
|
|
|
|
|
};
|
2020-11-20 16:06:26 -05:00
|
|
|
data = await plugins.hooks.fire('filter:messaging.notify', data);
|
2019-07-22 11:18:13 -04:00
|
|
|
if (!data || !data.uids || !data.uids.length) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2017-04-26 10:45:40 -06:00
|
|
|
|
2019-07-22 11:18:13 -04:00
|
|
|
uids = data.uids;
|
2021-02-04 00:01:39 -07:00
|
|
|
uids.forEach((uid) => {
|
2019-07-22 11:18:13 -04:00
|
|
|
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);
|
2019-07-22 11:18:13 -04:00
|
|
|
});
|
2019-10-09 13:29:49 -04:00
|
|
|
if (messageObj.system) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2019-07-22 11:18:13 -04:00
|
|
|
// Delayed notifications
|
2021-02-03 23:59:08 -07:00
|
|
|
let queueObj = Messaging.notifyQueue[`${fromUid}:${roomId}`];
|
2019-07-22 11:18:13 -04:00
|
|
|
if (queueObj) {
|
2021-02-03 23:59:08 -07:00
|
|
|
queueObj.message.content += `\n${messageObj.content}`;
|
2019-07-22 11:18:13 -04:00
|
|
|
clearTimeout(queueObj.timeout);
|
|
|
|
|
} else {
|
|
|
|
|
queueObj = {
|
|
|
|
|
message: messageObj,
|
|
|
|
|
};
|
2021-02-03 23:59:08 -07:00
|
|
|
Messaging.notifyQueue[`${fromUid}:${roomId}`] = queueObj;
|
2019-07-22 11:18:13 -04:00
|
|
|
}
|
2015-12-16 11:15:43 +02:00
|
|
|
|
2022-01-19 20:52:12 -05: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
|
|
|
|
2019-07-22 11:18:13 -04:00
|
|
|
async function sendNotifications(fromuid, uids, roomId, messageObj) {
|
2023-03-26 21:13:07 -04:00
|
|
|
const hasRead = await Messaging.hasRead(uids, roomId);
|
|
|
|
|
uids = uids.filter((uid, index) => !hasRead[index] && parseInt(fromuid, 10) !== parseInt(uid, 10));
|
2019-07-22 11:18:13 -04:00
|
|
|
if (!uids.length) {
|
2023-03-26 20:11:11 -04:00
|
|
|
delete Messaging.notifyQueue[`${fromuid}:${roomId}`];
|
2019-07-22 11:18:13 -04:00
|
|
|
return;
|
|
|
|
|
}
|
2015-12-16 11:15:43 +02:00
|
|
|
|
2022-01-19 16:19:11 +01:00
|
|
|
const { displayname } = messageObj.fromUser;
|
|
|
|
|
|
2020-11-17 12:52:02 -05:00
|
|
|
const isGroupChat = await Messaging.isGroupChat(roomId);
|
2019-07-22 11:18:13 -04:00
|
|
|
const notification = await notifications.create({
|
2020-11-17 12:52:02 -05:00
|
|
|
type: isGroupChat ? 'new-group-chat' : 'new-chat',
|
2022-01-19 16:19:11 +01:00
|
|
|
subject: `[[email:notif.chat.subject, ${displayname}]]`,
|
|
|
|
|
bodyShort: `[[notifications:new_message_from, ${displayname}]]`,
|
2021-02-11 12:55:00 -05:00
|
|
|
bodyLong: messageObj.content,
|
2021-02-03 23:59:08 -07:00
|
|
|
nid: `chat_${fromuid}_${roomId}`,
|
2019-07-22 11:18:13 -04:00
|
|
|
from: fromuid,
|
2021-02-03 23:59:08 -07:00
|
|
|
path: `/chats/${messageObj.roomId}`,
|
2015-12-16 11:15:43 +02:00
|
|
|
});
|
2019-07-22 11:18:13 -04: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
|
|
|
};
|