diff --git a/packages/rocketchat-lib/lib/RoomTypeConfig.js b/packages/rocketchat-lib/lib/RoomTypeConfig.js index 7ab4efcc7289..06d8dcfe8ab1 100644 --- a/packages/rocketchat-lib/lib/RoomTypeConfig.js +++ b/packages/rocketchat-lib/lib/RoomTypeConfig.js @@ -150,6 +150,16 @@ export class RoomTypeConfig { return true; } + /** + * Return a room's name + * + * @abstract + * @return {string} Room's name according to it's type + */ + roomName(/* room */) { + return ''; + } + canBeCreated() { return Meteor.isServer ? RocketChat.authz.hasAtLeastOnePermission(Meteor.userId(), [`create-${ this._identifier }`]) : @@ -203,4 +213,33 @@ export class RoomTypeConfig { getUiText(/* context */) { return ''; } + + /** + * Returns the full object of message sender + * @param {string} senderId Sender's _id + * @return {object} Sender's object from db + */ + getMsgSender(senderId) { + return Meteor.isServer ? RocketChat.models.Users.findOneById(senderId) : {}; + } + + /** + * Returns details to use on notifications + * + * @param {object} room + * @param {object} user + * @param {string} notificationMessage + * @return {object} Notification details + */ + getNotificationDetails(room, user, notificationMessage) { + if (!Meteor.isServer) { + return {}; + } + + const title = `#${ this.roomName(room) }`; + + const text = `${ RocketChat.settings.get('UI_Use_Real_Name') ? user.name : user.username }: ${ notificationMessage }`; + + return { title, text }; + } } diff --git a/packages/rocketchat-lib/lib/RoomTypesCommon.js b/packages/rocketchat-lib/lib/RoomTypesCommon.js index e7cead3d9dde..6c5ba9a08979 100644 --- a/packages/rocketchat-lib/lib/RoomTypesCommon.js +++ b/packages/rocketchat-lib/lib/RoomTypesCommon.js @@ -90,4 +90,12 @@ export class RoomTypesCommon { return FlowRouter.go(this.roomTypes[roomType].route.name, routeData, queryParams); } + + /** + * @param {string} roomType room type (e.g.: c (for channels), d (for direct channels)) + * @param {RoomTypeConfig} roomConfig room's type configuration + */ + getConfig(roomType) { + return this.roomTypes[roomType]; + } } diff --git a/packages/rocketchat-lib/lib/roomTypes/direct.js b/packages/rocketchat-lib/lib/roomTypes/direct.js index f1ba44c1cd02..9145751cdd16 100644 --- a/packages/rocketchat-lib/lib/roomTypes/direct.js +++ b/packages/rocketchat-lib/lib/roomTypes/direct.js @@ -111,4 +111,23 @@ export class DirectMessageRoomType extends RoomTypeConfig { return ''; } } + + /** + * Returns details to use on notifications + * + * @param {object} room + * @param {object} user + * @param {string} notificationMessage + * @return {object} Notification details + */ + getNotificationDetails(room, user, notificationMessage) { + if (!Meteor.isServer) { + return {}; + } + + const title = RocketChat.settings.get('UI_Use_Real_Name') ? user.name : `@${ user.username }`; + const text = notificationMessage; + + return { title, text }; + } } diff --git a/packages/rocketchat-lib/server/functions/notifications/desktop.js b/packages/rocketchat-lib/server/functions/notifications/desktop.js index bb58be4ec0ba..2b3cde4f3a61 100644 --- a/packages/rocketchat-lib/server/functions/notifications/desktop.js +++ b/packages/rocketchat-lib/server/functions/notifications/desktop.js @@ -16,19 +16,7 @@ export function notifyDesktopUser({ duration, notificationMessage }) { - const UI_Use_Real_Name = RocketChat.settings.get('UI_Use_Real_Name') === true; - - let title = ''; - let text = ''; - if (room.t === 'd') { - title = UI_Use_Real_Name ? user.name : `@${ user.username }`; - text = notificationMessage; - } else if (room.name) { - title = `#${ room.name }`; - text = `${ UI_Use_Real_Name ? user.name : user.username }: ${ notificationMessage }`; - } else { - return; - } + const { title, text } = RocketChat.roomTypes.getConfig(room.t).getNotificationDetails(room, user, notificationMessage); RocketChat.metrics.notificationsSent.inc({ notification_type: 'desktop' }); RocketChat.Notifications.notifyUser(userId, 'notification', { diff --git a/packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js b/packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js index 1f33a449b826..58ac97fe91f3 100644 --- a/packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js +++ b/packages/rocketchat-lib/server/lib/sendNotificationsOnMessage.js @@ -157,7 +157,7 @@ function sendAllNotifications(message, room) { return message; } - const sender = (room.t !== 'l') ? RocketChat.models.Users.findOneById(message.u._id) : room.v; + const sender = RocketChat.roomTypes.getConfig(room.t).getMsgSender(message.u._id); if (!sender) { return message; } diff --git a/packages/rocketchat-livechat/client/roomType.js b/packages/rocketchat-livechat/client/roomType.js new file mode 100644 index 000000000000..39927a740195 --- /dev/null +++ b/packages/rocketchat-livechat/client/roomType.js @@ -0,0 +1,3 @@ +import LivechatRoomType from '../imports/LivechatRoomType'; + +RocketChat.roomTypes.add(new LivechatRoomType()); diff --git a/packages/rocketchat-livechat/roomType.js b/packages/rocketchat-livechat/imports/LivechatRoomType.js similarity index 88% rename from packages/rocketchat-livechat/roomType.js rename to packages/rocketchat-livechat/imports/LivechatRoomType.js index a33231c19acf..8914b0de9c4a 100644 --- a/packages/rocketchat-livechat/roomType.js +++ b/packages/rocketchat-livechat/imports/LivechatRoomType.js @@ -1,5 +1,5 @@ /* globals openRoom, LivechatInquiry */ -import {RoomSettingsEnum, RoomTypeConfig, RoomTypeRouteConfig, UiTextContext} from 'meteor/rocketchat:lib'; +import { RoomSettingsEnum, RoomTypeConfig, RoomTypeRouteConfig, UiTextContext } from 'meteor/rocketchat:lib'; class LivechatRoomRoute extends RoomTypeRouteConfig { constructor() { @@ -20,7 +20,7 @@ class LivechatRoomRoute extends RoomTypeRouteConfig { } } -class LivechatRoomType extends RoomTypeConfig { +export default class LivechatRoomType extends RoomTypeConfig { constructor() { super({ identifier: 'l', @@ -82,5 +82,3 @@ class LivechatRoomType extends RoomTypeConfig { } } } - -RocketChat.roomTypes.add(new LivechatRoomType()); diff --git a/packages/rocketchat-livechat/package.js b/packages/rocketchat-livechat/package.js index 85745d4c6e9e..8f25b235f225 100644 --- a/packages/rocketchat-livechat/package.js +++ b/packages/rocketchat-livechat/package.js @@ -46,10 +46,10 @@ Package.onUse(function(api) { api.addFiles('server/visitorStatus.js', 'server'); api.addFiles('permissions.js', 'server'); api.addFiles('messageTypes.js'); - api.addFiles('roomType.js'); api.addFiles('config.js', 'server'); + api.addFiles('client/roomType.js', 'client'); api.addFiles('client/ui.js', 'client'); api.addFiles('client/route.js', 'client'); @@ -131,6 +131,9 @@ Package.onUse(function(api) { api.addFiles('client/views/app/triggers/livechatTriggerCondition.html', 'client'); api.addFiles('client/views/app/triggers/livechatTriggerCondition.js', 'client'); + // startup + api.addFiles('server/roomType.js', 'server'); + // hooks api.addFiles('server/hooks/externalMessage.js', 'server'); api.addFiles('server/hooks/leadCapture.js', 'server'); diff --git a/packages/rocketchat-livechat/server/roomType.js b/packages/rocketchat-livechat/server/roomType.js new file mode 100644 index 000000000000..ba36fffbd75b --- /dev/null +++ b/packages/rocketchat-livechat/server/roomType.js @@ -0,0 +1,25 @@ +import LivechatRoomType from '../imports/LivechatRoomType'; +import LivechatVisitors from './models/LivechatVisitors'; + +class LivechatRoomTypeServer extends LivechatRoomType { + getMsgSender(senderId) { + return LivechatVisitors.findOneById(senderId); + } + + /** + * Returns details to use on notifications + * + * @param {object} room + * @param {object} user + * @param {string} notificationMessage + * @return {object} Notification details + */ + getNotificationDetails(room, user, notificationMessage) { + const title = `[livechat] ${ this.roomName(room) }`; + const text = notificationMessage; + + return { title, text }; + } +} + +RocketChat.roomTypes.add(new LivechatRoomTypeServer());