diff --git a/public/language/en-GB/email.json b/public/language/en-GB/email.json
index 3b6709697e..8397609e8c 100644
--- a/public/language/en-GB/email.json
+++ b/public/language/en-GB/email.json
@@ -45,7 +45,7 @@
"digest.title.week": "Your Weekly Digest",
"digest.title.month": "Your Monthly Digest",
- "notif.chat.subject": "New chat message received from %1",
+ "notif.chat.subject": "New chat message received in \"%1\"",
"notif.chat.public-chat-subject": "New message from %1 in room %2",
"notif.chat.cta": "Click here to continue the conversation",
"notif.chat.unsub.info": "This chat notification was sent to you due to your subscription settings.",
diff --git a/public/language/en-GB/notifications.json b/public/language/en-GB/notifications.json
index a6de1bf3fe..5e9f98e3ac 100644
--- a/public/language/en-GB/notifications.json
+++ b/public/language/en-GB/notifications.json
@@ -27,6 +27,9 @@
"new_message_from": "New message from %1",
+ "new_messages_from": "%1 new messages from %2",
+ "new_message_in": "New message in %1",
+ "new_messages_in": "%1 new messages in %2",
"user_posted_in_public_room": "%1 wrote in %3",
"user_posted_in_public_room_dual": "%1 and %2 wrote in %4",
"user_posted_in_public_room_triple": "%1, %2 and %3 wrote in %5",
diff --git a/src/messaging/index.js b/src/messaging/index.js
index c012f858bc..7495069ad0 100644
--- a/src/messaging/index.js
+++ b/src/messaging/index.js
@@ -201,7 +201,7 @@ Messaging.getRecentChats = async (callerUid, uid, start, stop) => {
await Promise.all(results.roomData.map(async (room, index) => {
if (room) {
room.users = results.users[index];
- room.groupChat = room.hasOwnProperty('groupChat') ? room.groupChat : room.users.length > 2;
+ room.groupChat = room.users.length > 2;
room.unread = results.unread[index];
room.teaser = results.teasers[index];
diff --git a/src/messaging/notifications.js b/src/messaging/notifications.js
index ff1f98697f..084a6c768c 100644
--- a/src/messaging/notifications.js
+++ b/src/messaging/notifications.js
@@ -8,12 +8,8 @@ const notifications = require('../notifications');
const user = require('../user');
const io = require('../socket.io');
const plugins = require('../plugins');
-const meta = require('../meta');
module.exports = function (Messaging) {
- // Only used to notify a user of a new chat message
- Messaging.notifyQueue = {};
-
Messaging.setUserNotificationSetting = async (uid, roomId, value) => {
if (parseInt(value, 10) === -1) {
// go back to default
@@ -73,26 +69,11 @@ module.exports = function (Messaging) {
Messaging.pushUnreadCount(uids, unreadData);
}
- // Delayed notifications
- let queueObj = Messaging.notifyQueue[`${fromUid}:${roomId}`];
- if (queueObj) {
- queueObj.message.content += `\n${messageObj.content}`;
- clearTimeout(queueObj.timeout);
- } else {
- queueObj = {
- message: messageObj,
- };
- Messaging.notifyQueue[`${fromUid}:${roomId}`] = queueObj;
+ try {
+ await sendNotification(fromUid, roomId, messageObj);
+ } catch (err) {
+ winston.error(`[messaging/notifications] Unabled to send notification\n${err.stack}`);
}
-
- queueObj.timeout = setTimeout(async () => {
- try {
- await sendNotification(fromUid, roomId, queueObj.message);
- delete Messaging.notifyQueue[`${fromUid}:${roomId}`];
- } catch (err) {
- winston.error(`[messaging/notifications] Unabled to send notification\n${err.stack}`);
- }
- }, meta.config.notificationSendDelay * 1000);
};
async function sendNotification(fromUid, roomId, messageObj) {
@@ -121,21 +102,22 @@ module.exports = function (Messaging) {
if (uidsToNotify.length) {
const { displayname } = messageObj.fromUser;
const isGroupChat = await Messaging.isGroupChat(roomId);
+ const roomName = roomData.roomName || `[[modules:chat.room-id, ${roomId}]]`;
const notifData = {
type: isGroupChat ? 'new-group-chat' : 'new-chat',
- subject: `[[email:notif.chat.subject, ${displayname}]]`,
- bodyShort: `[[notifications:new_message_from, ${displayname}]]`,
+ subject: `[[email:notif.chat.subject, ${roomName}]]`,
+ bodyShort: isGroupChat || roomData.roomName ? `[[notifications:new_message_in, ${roomName}]]` : `[[notifications:new_message_from, ${displayname}]]`,
bodyLong: messageObj.content,
- nid: `chat_${roomId}_${fromUid}`,
+ nid: `chat_${roomId}_${fromUid}_${Date.now()}`,
+ mergeId: `new-chat|${roomId}`, // as roomId is the differentiator, no distinction between direct vs. group req'd.
from: fromUid,
- roomId: roomId,
+ roomId,
+ roomName,
path: `/chats/${messageObj.roomId}`,
};
if (roomData.public) {
const icon = Messaging.getRoomIcon(roomData);
- const roomName = roomData.roomName || `[[modules:chat.room-id, ${roomId}]]`;
notifData.type = 'new-public-chat';
- notifData.roomName = roomName;
notifData.roomIcon = icon;
notifData.subject = `[[email:notif.chat.public-chat-subject, ${displayname}, ${roomName}]]`;
notifData.bodyShort = `[[notifications:user_posted_in_public_room, ${displayname}, ${icon}, ${roomName}]]`;
diff --git a/src/messaging/rooms.js b/src/messaging/rooms.js
index a1312bf3a8..14d9baf924 100644
--- a/src/messaging/rooms.js
+++ b/src/messaging/rooms.js
@@ -48,9 +48,7 @@ module.exports = function (Messaging) {
db.parseIntFields(data, intFields, fields);
data.roomName = validator.escape(String(data.roomName || ''));
data.public = parseInt(data.public, 10) === 1;
- if (data.hasOwnProperty('groupChat')) {
- data.groupChat = parseInt(data.groupChat, 10) === 1;
- }
+ data.groupChat = data.userCount > 2;
if (!fields.length || fields.includes('notificationSetting')) {
data.notificationSetting = data.notificationSetting ||
@@ -287,7 +285,8 @@ module.exports = function (Messaging) {
};
Messaging.isGroupChat = async function (roomId) {
- return (await Messaging.getRoomData(roomId)).groupChat;
+ const count = await Messaging.getUserCountInRoom(roomId);
+ return count > 2;
};
async function updateUserCount(roomIds) {
@@ -523,7 +522,7 @@ module.exports = function (Messaging) {
room.isOwner = isOwner;
room.users = users;
room.canReply = canReply;
- room.groupChat = room.hasOwnProperty('groupChat') ? room.groupChat : users.length > 2;
+ room.groupChat = users.length > 2;
room.icon = Messaging.getRoomIcon(room);
room.usernames = Messaging.generateUsernames(room, uid);
room.chatWithMessage = await Messaging.generateChatWithMessage(room, uid, settings.userLang);
diff --git a/src/notifications.js b/src/notifications.js
index 725bd85fbc..d3eaa0e50c 100644
--- a/src/notifications.js
+++ b/src/notifications.js
@@ -374,6 +374,7 @@ Notifications.merge = async function (notifications) {
'notifications:user_posted_to',
'notifications:user_flagged_post_in',
'notifications:user_flagged_user',
+ 'new-chat',
'notifications:user_posted_in_public_room',
'new_register',
'post-queue',
@@ -417,6 +418,15 @@ Notifications.merge = async function (notifications) {
}
const notifObj = notifications[modifyIndex];
switch (mergeId) {
+ case 'new-chat': {
+ const { roomId, roomName, type, user } = set[0];
+ const isGroupChat = type === 'new-group-chat';
+ notifObj.bodyShort = isGroupChat || (roomName !== `[[modules:chat.room-id, ${roomId}]]`) ?
+ `[[notifications:new_messages_in, ${set.length}, ${roomName}]]` :
+ `[[notifications:new_messages_from, ${set.length}, ${user.displayname}]]`;
+ break;
+ }
+
case 'notifications:user_posted_in_public_room': {
const usernames = _.uniq(set.map(notifObj => notifObj && notifObj.user && notifObj.user.displayname));
if (usernames.length === 2 || usernames.length === 3) {