diff --git a/packages/rocketchat-cas/cas_server.js b/packages/rocketchat-cas/cas_server.js
index d25e257daa77..deeebb398068 100644
--- a/packages/rocketchat-cas/cas_server.js
+++ b/packages/rocketchat-cas/cas_server.js
@@ -249,7 +249,9 @@ Accounts.registerLoginHandler(function(options) {
ts: new Date(),
open: true,
alert: true,
- unread: 1
+ unread: 1,
+ userMentions: 1,
+ groupMentions: 0
});
}
});
diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json
index 5fa8d7699c6b..6e05354aa88f 100644
--- a/packages/rocketchat-i18n/i18n/en.i18n.json
+++ b/packages/rocketchat-i18n/i18n/en.i18n.json
@@ -635,6 +635,7 @@
"GoogleCloudStorage": "Google Cloud Storage",
"GoogleNaturalLanguage_ServiceAccount_Description": "Service account key JSON file. More information can be found [here](https://cloud.google.com/natural-language/docs/common/auth#set_up_a_service_account)",
"GoogleTagManager_id": "Google Tag Manager Id",
+ "Group_mentions_only": "Group mentions only",
"Guest_Pool": "Guest Pool",
"Hash": "Hash",
"Header": "Header",
@@ -1712,6 +1713,7 @@
"Unmute_user": "Unmute user",
"Unnamed": "Unnamed",
"Unpin_Message": "Unpin Message",
+ "Unread_Count": "Unread Count",
"Unread_Tray_Icon_Alert": "Unread Tray Icon Alert",
"Unread_Messages": "Unread Messages",
"Unread_Rooms": "Unread Rooms",
@@ -1741,6 +1743,7 @@
"User_added": "User added",
"User_added_by": "User __user_added__ added by __user_by__.",
"User_added_successfully": "User added successfully",
+ "User_and_group_mentions_only": "User and group mentions only",
"User_doesnt_exist": "No user exists by the name of `@%s`.",
"User_has_been_activated": "User has been activated",
"User_has_been_deactivated": "User has been deactivated",
@@ -1761,6 +1764,7 @@
"User_left_male": "Has left the channel.",
"User_logged_out": "User is logged out",
"User_management": "User Management",
+ "User_mentions_only": "User mentions only",
"User_muted": "User Muted",
"User_muted_by": "User __user_muted__ muted by __user_by__.",
"User_not_found": "User not found",
@@ -1877,4 +1881,4 @@
"your_message_optional": "your message (optional)",
"Your_password_is_wrong": "Your password is wrong!",
"Your_push_was_sent_to_s_devices": "Your push was sent to %s devices"
-}
\ No newline at end of file
+}
diff --git a/packages/rocketchat-irc/server/server.js b/packages/rocketchat-irc/server/server.js
index fd085e206005..ebfd223f7758 100644
--- a/packages/rocketchat-irc/server/server.js
+++ b/packages/rocketchat-irc/server/server.js
@@ -359,6 +359,8 @@ class IrcClient {
open: false,
alert: false,
unread: 0,
+ userMentions: 0,
+ groupMentions: 0,
u: { _id: target._id, username: target.username }}
});
return { t: 'd', _id: rid };
diff --git a/packages/rocketchat-lib/server/functions/addUserToDefaultChannels.js b/packages/rocketchat-lib/server/functions/addUserToDefaultChannels.js
index e63628c8f915..414e5e3b7588 100644
--- a/packages/rocketchat-lib/server/functions/addUserToDefaultChannels.js
+++ b/packages/rocketchat-lib/server/functions/addUserToDefaultChannels.js
@@ -14,7 +14,9 @@ RocketChat.addUserToDefaultChannels = function(user, silenced) {
ts: new Date(),
open: true,
alert: true,
- unread: 1
+ unread: 1,
+ userMentions: 1,
+ groupMentions: 0
});
// Insert user joined message
diff --git a/packages/rocketchat-lib/server/functions/addUserToRoom.js b/packages/rocketchat-lib/server/functions/addUserToRoom.js
index 47ae76aeaabe..527b68fab3f8 100644
--- a/packages/rocketchat-lib/server/functions/addUserToRoom.js
+++ b/packages/rocketchat-lib/server/functions/addUserToRoom.js
@@ -18,7 +18,9 @@ RocketChat.addUserToRoom = function(rid, user, inviter, silenced) {
ts: now,
open: true,
alert: true,
- unread: 1
+ unread: 1,
+ userMentions: 1,
+ groupMentions: 0
});
if (!silenced) {
diff --git a/packages/rocketchat-lib/server/lib/notifyUsersOnMessage.js b/packages/rocketchat-lib/server/lib/notifyUsersOnMessage.js
index aab32579decd..b14089ad6cb3 100644
--- a/packages/rocketchat-lib/server/lib/notifyUsersOnMessage.js
+++ b/packages/rocketchat-lib/server/lib/notifyUsersOnMessage.js
@@ -39,10 +39,7 @@ RocketChat.callbacks.add('afterSaveMessage', function(message, room) {
return has;
}
- if (room.t != null && room.t === 'd') {
- // Update the other subscriptions
- RocketChat.models.Subscriptions.incUnreadOfDirectForRoomIdExcludingUserId(message.rid, message.u._id, 1);
- } else {
+ if (room != null) {
let toAll = false;
let toHere = false;
const mentionIds = [];
@@ -71,10 +68,22 @@ RocketChat.callbacks.add('afterSaveMessage', function(message, room) {
}
});
+ const unreadCount = RocketChat.settings.get('Unread_Count');
+
if (toAll || toHere) {
- RocketChat.models.Subscriptions.incUnreadForRoomIdExcludingUserId(room._id, message.u._id);
+ let incUnread = 0;
+ if (['all_messages', 'group_mentions_only', 'user_and_group_mentions_only'].includes(unreadCount)) {
+ incUnread = 1;
+ }
+ RocketChat.models.Subscriptions.incGroupMentionsAndUnreadForRoomIdExcludingUserId(room._id, message.u._id, 1, incUnread);
} else if ((mentionIds && mentionIds.length > 0) || (highlightsIds && highlightsIds.length > 0)) {
- RocketChat.models.Subscriptions.incUnreadForRoomIdAndUserIds(room._id, _.compact(_.unique(mentionIds.concat(highlightsIds))));
+ let incUnread = 0;
+ if (['all_messages', 'user_mentions_only', 'user_and_group_mentions_only'].includes(unreadCount)) {
+ incUnread = 1;
+ }
+ RocketChat.models.Subscriptions.incUserMentionsAndUnreadForRoomIdAndUserIds(room._id, _.compact(_.unique(mentionIds.concat(highlightsIds))), 1, incUnread);
+ } else if (unreadCount === 'all_messages') {
+ RocketChat.models.Subscriptions.incUnreadForRoomIdExcludingUserId(room._id, message.u._id);
}
}
diff --git a/packages/rocketchat-lib/server/models/Subscriptions.js b/packages/rocketchat-lib/server/models/Subscriptions.js
index 2cd8febf09a1..775065ab6481 100644
--- a/packages/rocketchat-lib/server/models/Subscriptions.js
+++ b/packages/rocketchat-lib/server/models/Subscriptions.js
@@ -241,6 +241,8 @@ class ModelSubscriptions extends RocketChat.models._Base {
open: true,
alert: false,
unread: 0,
+ userMentions: 0,
+ groupMentions: 0,
ls: new Date
}
};
@@ -336,11 +338,10 @@ class ModelSubscriptions extends RocketChat.models._Base {
return this.update(query, update, { multi: true });
}
- incUnreadOfDirectForRoomIdExcludingUserId(roomId, userId, inc) {
+ incUnreadForRoomIdExcludingUserId(roomId, userId, inc) {
if (inc == null) { inc = 1; }
const query = {
rid: roomId,
- t: 'd',
'u._id': {
$ne: userId
}
@@ -359,8 +360,7 @@ class ModelSubscriptions extends RocketChat.models._Base {
return this.update(query, update, { multi: true });
}
- incUnreadForRoomIdExcludingUserId(roomId, userId, inc) {
- if (inc == null) { inc = 1; }
+ incGroupMentionsAndUnreadForRoomIdExcludingUserId(roomId, userId, incGroup = 1, incUnread = 1) {
const query = {
rid: roomId,
'u._id': {
@@ -374,15 +374,15 @@ class ModelSubscriptions extends RocketChat.models._Base {
open: true
},
$inc: {
- unread: inc
+ unread: incUnread,
+ groupMentions: incGroup
}
};
return this.update(query, update, { multi: true });
}
- incUnreadForRoomIdAndUserIds(roomId, userIds, inc) {
- if (inc == null) { inc = 1; }
+ incUserMentionsAndUnreadForRoomIdAndUserIds(roomId, userIds, incUser = 1, incUnread = 1) {
const query = {
rid: roomId,
'u._id': {
@@ -396,7 +396,8 @@ class ModelSubscriptions extends RocketChat.models._Base {
open: true
},
$inc: {
- unread: inc
+ unread: incUnread,
+ userMentions: incUser
}
};
@@ -537,6 +538,8 @@ class ModelSubscriptions extends RocketChat.models._Base {
open: false,
alert: false,
unread: 0,
+ userMentions: 0,
+ groupMentions: 0,
ts: room.ts,
rid: room._id,
name: room.name,
diff --git a/packages/rocketchat-lib/server/startup/settings.js b/packages/rocketchat-lib/server/startup/settings.js
index 9f6d4cec72ff..d93b106c04f5 100644
--- a/packages/rocketchat-lib/server/startup/settings.js
+++ b/packages/rocketchat-lib/server/startup/settings.js
@@ -354,6 +354,25 @@ RocketChat.settings.addGroup('General', function() {
type: 'boolean',
'public': true
});
+ this.add('Unread_Count', 'user_and_group_mentions_only', {
+ type: 'select',
+ values: [
+ {
+ key: 'all_messages',
+ i18nLabel: 'All_messages'
+ }, {
+ key: 'user_mentions_only',
+ i18nLabel: 'User_mentions_only'
+ }, {
+ key: 'group_mentions_only',
+ i18nLabel: 'Group_mentions_only'
+ }, {
+ key: 'user_and_group_mentions_only',
+ i18nLabel: 'User_and_group_mentions_only'
+ }
+ ],
+ 'public': true
+ });
this.add('CDN_PREFIX', '', {
type: 'string',
'public': true
diff --git a/packages/rocketchat-livechat/server/lib/Livechat.js b/packages/rocketchat-livechat/server/lib/Livechat.js
index aa9200a1ac9c..c4f48c7f9365 100644
--- a/packages/rocketchat-livechat/server/lib/Livechat.js
+++ b/packages/rocketchat-livechat/server/lib/Livechat.js
@@ -317,6 +317,8 @@ RocketChat.Livechat = {
alert: true,
open: true,
unread: 1,
+ userMentions: 1,
+ groupMentions: 0,
code: room.code,
u: {
_id: agent.agentId,
diff --git a/packages/rocketchat-livechat/server/lib/QueueMethods.js b/packages/rocketchat-livechat/server/lib/QueueMethods.js
index c1e8d887a6a9..425dc26fdded 100644
--- a/packages/rocketchat-livechat/server/lib/QueueMethods.js
+++ b/packages/rocketchat-livechat/server/lib/QueueMethods.js
@@ -40,6 +40,8 @@ RocketChat.QueueMethods = {
alert: true,
open: true,
unread: 1,
+ userMentions: 1,
+ groupMentions: 0,
code: roomCode,
u: {
_id: agent.agentId,
diff --git a/packages/rocketchat-livechat/server/methods/takeInquiry.js b/packages/rocketchat-livechat/server/methods/takeInquiry.js
index 5d73a1fadda4..f1277d8d4ccc 100644
--- a/packages/rocketchat-livechat/server/methods/takeInquiry.js
+++ b/packages/rocketchat-livechat/server/methods/takeInquiry.js
@@ -24,6 +24,8 @@ Meteor.methods({
alert: true,
open: true,
unread: 1,
+ userMentions: 1,
+ groupMentions: 0,
code: inquiry.code,
u: {
_id: agent.agentId,
diff --git a/server/methods/addAllUserToRoom.js b/server/methods/addAllUserToRoom.js
index 5239c90e0819..14a6d1a770f0 100644
--- a/server/methods/addAllUserToRoom.js
+++ b/server/methods/addAllUserToRoom.js
@@ -37,7 +37,9 @@ Meteor.methods({
ts: now,
open: true,
alert: true,
- unread: 1
+ unread: 1,
+ userMentions: 1,
+ groupMentions: 0
});
RocketChat.models.Messages.createUserJoinWithRoomIdAndUser(rid, user, {
ts: now
diff --git a/server/methods/createDirectMessage.js b/server/methods/createDirectMessage.js
index ea60ca95dd5d..da0d2426be94 100644
--- a/server/methods/createDirectMessage.js
+++ b/server/methods/createDirectMessage.js
@@ -66,6 +66,8 @@ Meteor.methods({
t: 'd',
alert: false,
unread: 0,
+ userMentions: 0,
+ groupMentions: 0,
u: {
_id: me._id,
username: me.username
@@ -92,6 +94,8 @@ Meteor.methods({
open: false,
alert: false,
unread: 0,
+ userMentions: 0,
+ groupMentions: 0,
u: {
_id: to._id,
username: to.username
diff --git a/server/publications/subscription.js b/server/publications/subscription.js
index 93b24a52420a..c4645395bd5f 100644
--- a/server/publications/subscription.js
+++ b/server/publications/subscription.js
@@ -12,6 +12,8 @@ const fields = {
alert: 1,
roles: 1,
unread: 1,
+ userMentions: 1,
+ groupMentions: 1,
archived: 1,
audioNotification: 1,
desktopNotifications: 1,