From b8be58d303bfbd3085bce8f2b84eab2f71d8150c Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Fri, 12 Feb 2016 09:49:16 -0200 Subject: [PATCH] offline emails refactor --- packages/rocketchat-lib/package.js | 1 + .../server/lib/sendEmailOnMessage.js | 62 +++++++++++++++++++ .../rocketchat-lib/server/models/Users.coffee | 20 ++++++ 3 files changed, 83 insertions(+) create mode 100644 packages/rocketchat-lib/server/lib/sendEmailOnMessage.js diff --git a/packages/rocketchat-lib/package.js b/packages/rocketchat-lib/package.js index 439c2bae9ad..2fb6c0c807a 100644 --- a/packages/rocketchat-lib/package.js +++ b/packages/rocketchat-lib/package.js @@ -47,6 +47,7 @@ Package.onUse(function(api) { api.addFiles('server/lib/roomTypes.coffee', 'server'); api.addFiles('server/lib/sendNotificationsOnMessage.js', 'server'); api.addFiles('server/lib/notifyUsersOnMessage.js', 'server'); + api.addFiles('server/lib/sendEmailOnMessage.js', 'server'); // SERVER MODELS api.addFiles('server/models/_Base.coffee', 'server'); diff --git a/packages/rocketchat-lib/server/lib/sendEmailOnMessage.js b/packages/rocketchat-lib/server/lib/sendEmailOnMessage.js new file mode 100644 index 00000000000..fe531b42875 --- /dev/null +++ b/packages/rocketchat-lib/server/lib/sendEmailOnMessage.js @@ -0,0 +1,62 @@ +RocketChat.callbacks.add('afterSaveMessage', function(message, room) { + var emailSubject, mentionIds = []; + + if (room.t === 'd') { + mentionIds.push(message.rid.replace(message.u._id, '')); + + emailSubject = TAPi18n.__("Offline_DM_Email", { + site: RocketChat.settings.get('Site_Name'), + user: message.u.username + }); + + } else { + if (message.mentions) { + message.mentions.forEach(function(mention) { + return mentionIds.push(mention._id); + }); + } + + emailSubject = TAPi18n.__("Offline_Mention_Email", { + site: RocketChat.settings.get('Site_Name'), + user: message.u.username, + room: room.name + }); + } + + // code duplicate of packages/rocketchat-ui-message/message/message.coffee + message.html = s.escapeHTML(message.msg); + message = RocketChat.callbacks.run('renderMessage', message); + if (message.tokens && message.tokens.length > 0) { + message.tokens.forEach((token) => { + token.text = token.text.replace(/([^\$])(\$[^\$])/gm, '$1$$$2'); + message.html = message.html.replace(token.token, token.text); + }); + } + message.html = message.html.replace(/\n/gm, '
'); + + if (mentionIds.length > 0) { + var usersOfMention = RocketChat.models.Users.getUsersToSendOfflineEmail(mentionIds).fetch(); + + if (usersOfMention && usersOfMention.length > 0) { + usersOfMention.forEach((user) => { + user.emails.some((email) => { + if (email.verified) { + var email = { + to: email.address, + from: RocketChat.settings.get('From_Email'), + subject: emailSubject, + html: "> " + message.html + }; + + Email.send(email); + + return true; + } + }); + }); + } + } + + return message; + +}, RocketChat.callbacks.priority.LOW); diff --git a/packages/rocketchat-lib/server/models/Users.coffee b/packages/rocketchat-lib/server/models/Users.coffee index 8175aec218d..76ceb72fd9a 100644 --- a/packages/rocketchat-lib/server/models/Users.coffee +++ b/packages/rocketchat-lib/server/models/Users.coffee @@ -268,3 +268,23 @@ RocketChat.models.Users = new class extends RocketChat.models._Base verified: false return @remove query + + ### + Find users to send a message by email if: + - he is not online + - has a verified email + - has not disabled email notifications + ### + getUsersToSendOfflineEmail: (usersIds) -> + query = + _id: + $in: usersIds + status: 'offline' + statusConnection: + $ne: 'online' + 'emails.verified': true + 'settings.preferences.emailNotificationMode': + $ne: 'disabled' + + return @find query, { fields: { emails: 1 } } +