From 9f5fa8d483fcc6fcbbed8dd476835eb97913b93a Mon Sep 17 00:00:00 2001 From: Alex Brazier Date: Fri, 14 Apr 2017 00:30:54 +0100 Subject: [PATCH 1/5] Show full name in mentions --- packages/rocketchat-mentions/client.js | 6 ++++-- packages/rocketchat-mentions/server.js | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/rocketchat-mentions/client.js b/packages/rocketchat-mentions/client.js index 041eb0bfb123..81448e3c103f 100644 --- a/packages/rocketchat-mentions/client.js +++ b/packages/rocketchat-mentions/client.js @@ -17,10 +17,12 @@ function MentionsClient(message) { if (['all', 'here'].includes(username)) { return match.replace(mention, `${ mention }`); } - if (message.temp == null && _.findWhere(message.mentions, {username}) == null) { + const mentionObj = _.findWhere(message.mentions, {username}); + if (message.temp == null && mentionObj == null) { return match; } - return match.replace(mention, `${ mention }`); + const name = RocketChat.settings.get('UI_Use_Real_Name') && mentionObj && mentionObj.name; + return match.replace(mention, `${ name || mention }`); }); const msgChannelRegex = new RegExp(`(?:^|\\s|\\n)(#(${ RocketChat.settings.get('UTF8_Names_Validation') }))[:.,\s]?`, 'g'); diff --git a/packages/rocketchat-mentions/server.js b/packages/rocketchat-mentions/server.js index 66aa59c08661..06877fe6cbd8 100644 --- a/packages/rocketchat-mentions/server.js +++ b/packages/rocketchat-mentions/server.js @@ -26,7 +26,7 @@ function MentionsServer(message) { username: mention }); }); - mentions = userMentions.length ? Meteor.users.find({ username: {$in: _.unique(userMentions)}}, { fields: {_id: true, username: true }}).fetch() : []; + mentions = userMentions.length ? Meteor.users.find({ username: {$in: _.unique(userMentions)}}, { fields: {_id: true, username: true, name: true }}).fetch() : []; const verifiedMentions = [...mentionsAll, ...mentions]; if (verifiedMentions.length !== 0) { From 9753c716a59f998e4639d5bdab65e89d9c4d258a Mon Sep 17 00:00:00 2001 From: Alex Brazier Date: Mon, 17 Apr 2017 22:58:29 +0100 Subject: [PATCH 2/5] Use cache for mention real names --- .../rocketchat-lib/server/methods/getChannelHistory.js | 6 ++++++ packages/rocketchat-mentions/server.js | 2 +- server/methods/loadHistory.js | 6 ++++++ server/stream/messages.js | 7 +++++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/rocketchat-lib/server/methods/getChannelHistory.js b/packages/rocketchat-lib/server/methods/getChannelHistory.js index e2f40ebe748a..0f3194991f56 100644 --- a/packages/rocketchat-lib/server/methods/getChannelHistory.js +++ b/packages/rocketchat-lib/server/methods/getChannelHistory.js @@ -57,6 +57,12 @@ Meteor.methods({ const user = RocketChat.models.Users.findOneById(message.u._id); message.u.name = user && user.name; } + if (message.mentions && message.mentions.length && UI_Use_Real_Name) { + message.mentions.forEach((mention) => { + const user = RocketChat.models.Users.findOneById(mention._id); + mention.name = user && user.name; + }); + } return message; }); diff --git a/packages/rocketchat-mentions/server.js b/packages/rocketchat-mentions/server.js index 06877fe6cbd8..92b38dd1d6a0 100644 --- a/packages/rocketchat-mentions/server.js +++ b/packages/rocketchat-mentions/server.js @@ -26,7 +26,7 @@ function MentionsServer(message) { username: mention }); }); - mentions = userMentions.length ? Meteor.users.find({ username: {$in: _.unique(userMentions)}}, { fields: {_id: true, username: true, name: true }}).fetch() : []; + mentions = userMentions.length ? Meteor.users.find({ username: {$in: _.unique(userMentions)}}, { fields: {_id: true, username: true}}).fetch() : []; const verifiedMentions = [...mentionsAll, ...mentions]; if (verifiedMentions.length !== 0) { diff --git a/server/methods/loadHistory.js b/server/methods/loadHistory.js index 8404d9e81b8e..963eb70581ea 100644 --- a/server/methods/loadHistory.js +++ b/server/methods/loadHistory.js @@ -68,6 +68,12 @@ Meteor.methods({ const user = RocketChat.models.Users.findOneById(message.u._id); message.u.name = user && user.name; } + if (message.mentions && message.mentions.length && UI_Use_Real_Name) { + message.mentions.forEach((mention) => { + const user = RocketChat.models.Users.findOneById(mention._id); + mention.name = user && user.name; + }); + } return message; }); diff --git a/server/stream/messages.js b/server/stream/messages.js index cffeb442a7cb..96afa00f6bc7 100644 --- a/server/stream/messages.js +++ b/server/stream/messages.js @@ -51,6 +51,13 @@ Meteor.startup(function() { const user = RocketChat.models.Users.findOneById(record.u._id); record.u.name = user && user.name; } + + if (record.mentions && record.mentions.length && UI_Use_Real_Name) { + record.mentions.forEach((mention) => { + const user = RocketChat.models.Users.findOneById(mention._id); + mention.name = user && user.name; + }); + } msgStream.emitWithoutBroadcast('__my_messages__', record, {}); return msgStream.emitWithoutBroadcast(record.rid, record); } From d7a2e5cfc1d523da43de7f400ce97e14a0ffbd05 Mon Sep 17 00:00:00 2001 From: Alex Brazier Date: Mon, 17 Apr 2017 23:03:08 +0100 Subject: [PATCH 3/5] Revert rocketchat-mentions/server.js --- packages/rocketchat-mentions/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rocketchat-mentions/server.js b/packages/rocketchat-mentions/server.js index 92b38dd1d6a0..66aa59c08661 100644 --- a/packages/rocketchat-mentions/server.js +++ b/packages/rocketchat-mentions/server.js @@ -26,7 +26,7 @@ function MentionsServer(message) { username: mention }); }); - mentions = userMentions.length ? Meteor.users.find({ username: {$in: _.unique(userMentions)}}, { fields: {_id: true, username: true}}).fetch() : []; + mentions = userMentions.length ? Meteor.users.find({ username: {$in: _.unique(userMentions)}}, { fields: {_id: true, username: true }}).fetch() : []; const verifiedMentions = [...mentionsAll, ...mentions]; if (verifiedMentions.length !== 0) { From 652e7ac2018e984ab64f4025065bf2f82a9045ce Mon Sep 17 00:00:00 2001 From: Alex Brazier Date: Tue, 18 Apr 2017 13:54:48 +0100 Subject: [PATCH 4/5] Update mention name when user changes name --- client/notifications/UsersNameChanged.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/client/notifications/UsersNameChanged.js b/client/notifications/UsersNameChanged.js index 77d153ba708d..68f23ea3e133 100644 --- a/client/notifications/UsersNameChanged.js +++ b/client/notifications/UsersNameChanged.js @@ -10,6 +10,18 @@ Meteor.startup(function() { multi: true }); + RocketChat.models.Messages.update({ + mentions: { + $elemMatch: { _id } + } + }, { + $set: { + 'mentions.$.name': name + } + }, { + multi: true + }); + RocketChat.models.Subscriptions.update({ name: username, t: 'd' From 8930ea911d6546d19bc5987b91cfb0048c2276e0 Mon Sep 17 00:00:00 2001 From: Alex Brazier Date: Tue, 18 Apr 2017 15:35:17 +0100 Subject: [PATCH 5/5] Replace @username with real name in notifications --- .../server/lib/sendNotificationsOnMessage.js | 144 +++++++++++------- 1 file changed, 86 insertions(+), 58 deletions(-) diff --git a/packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js b/packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js index 85ab61fb1119..eb1aa21a28fa 100644 --- a/packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js +++ b/packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js @@ -1,6 +1,81 @@ /* globals Push */ import moment from 'moment'; +/** + * Replaces @username with full name + * + * @param {string} message The message to replace + * @param {object[]} mentions Array of mentions used to make replacements + * + * @returns {string} + */ +function replaceMentionedUsernamesWithFullNames(message, mentions) { + if (!mentions || !mentions.length) { + return message; + } + mentions.forEach((mention) => { + const user = RocketChat.models.Users.findOneById(mention._id); + if (user && user.name) { + message = message.replace(`@${ mention.username }`, user.name); + } + }); + return message; +} + +/** + * Send notification to user + * + * @param {string} userId The user to notify + * @param {object} user The sender + * @param {object} room The room send from + * @param {number} duration Duration of notification + */ +function notifyUser(userId, user, message, room, duration) { + const UI_Use_Real_Name = RocketChat.settings.get('UI_Use_Real_Name') === true; + if (UI_Use_Real_Name) { + message.msg = replaceMentionedUsernamesWithFullNames(message.msg, message.mentions); + } + let title = UI_Use_Real_Name ? user.name : `@${ user.username }`; + if (room.t !== 'd' && room.name) { + title += ` @ #${ room.name }`; + } + RocketChat.Notifications.notifyUser(userId, 'notification', { + title, + text: message.msg, + duration, + payload: { + _id: message._id, + rid: message.rid, + sender: message.u, + type: room.t, + name: room.name + } + }); +} + +/** + * Checks if a message contains a user highlight + * + * @param {string} message + * @param {array|undefined} highlights + * + * @returns {boolean} + */ +function messageContainsHighlight(message, highlights) { + if (! highlights || highlights.length === 0) { return false; } + + let has = false; + highlights.some(function(highlight) { + const regexp = new RegExp(s.escapeRegExp(highlight), 'i'); + if (regexp.test(message.msg)) { + has = true; + return true; + } + }); + + return has; +} + RocketChat.callbacks.add('afterSaveMessage', function(message, room) { // skips this callback if the message was edited if (message.editedAt) { @@ -16,7 +91,13 @@ RocketChat.callbacks.add('afterSaveMessage', function(message, room) { /* Increment unread couter if direct messages */ - const settings = {}; + const settings = { + alwaysNotifyDesktopUsers: [], + dontNotifyDesktopUsers: [], + alwaysNotifyMobileUsers: [], + dontNotifyMobileUsers: [], + desktopNotificationDurations: {} + }; /** * Checks if a given user can be notified @@ -35,35 +116,6 @@ RocketChat.callbacks.add('afterSaveMessage', function(message, room) { return (settings[types[type][0]].indexOf(id) === -1 || settings[types[type][1]].indexOf(id) !== -1); } - /** - * Checks if a message contains a user highlight - * - * @param {string} message - * @param {array|undefined} highlights - * - * @returns {boolean} - */ - function messageContainsHighlight(message, highlights) { - if (! highlights || highlights.length === 0) { return false; } - - let has = false; - highlights.some(function(highlight) { - const regexp = new RegExp(s.escapeRegExp(highlight), 'i'); - if (regexp.test(message.msg)) { - has = true; - return true; - } - }); - - return has; - } - - settings.alwaysNotifyDesktopUsers = []; - settings.dontNotifyDesktopUsers = []; - settings.alwaysNotifyMobileUsers = []; - settings.dontNotifyMobileUsers = []; - settings.desktopNotificationDurations = {}; - const notificationPreferencesByRoom = RocketChat.models.Subscriptions.findNotificationPreferencesByRoom(room._id); notificationPreferencesByRoom.forEach(function(subscription) { if (subscription.desktopNotifications === 'all') { @@ -127,18 +179,8 @@ RocketChat.callbacks.add('afterSaveMessage', function(message, room) { } if ((userOfMention != null) && canBeNotified(userOfMentionId, 'mobile')) { - RocketChat.Notifications.notifyUser(userOfMention._id, 'notification', { - title: RocketChat.settings.get('UI_Use_Real_Name') ? user.name : `@${ user.username }`, - text: message.msg, - duration: settings.desktopNotificationDurations[userOfMention._id], - payload: { - _id: message._id, - rid: message.rid, - sender: message.u, - type: room.t, - name: room.name - } - }); + const duration = settings.desktopNotificationDurations[userOfMention._id]; + notifyUser(userOfMention._id, user, message, room, duration); } if ((userOfMention != null) && canBeNotified(userOfMentionId, 'desktop')) { @@ -273,22 +315,8 @@ RocketChat.callbacks.add('afterSaveMessage', function(message, room) { if (userIdsToNotify.length > 0) { for (const usersOfMentionId of userIdsToNotify) { - let title = `@${ user.username }`; - if (room.name) { - title += ` @ #${ room.name }`; - } - RocketChat.Notifications.notifyUser(usersOfMentionId, 'notification', { - title, - text: message.msg, - duration: settings.desktopNotificationDurations[usersOfMentionId], - payload: { - _id: message._id, - rid: message.rid, - sender: message.u, - type: room.t, - name: room.name - } - }); + const duration = settings.desktopNotificationDurations[usersOfMentionId]; + notifyUser(usersOfMentionId, user, message, room, duration); } }