diff --git a/packages/rocketchat-channel-settings/client/startup/messageTypes.coffee b/packages/rocketchat-channel-settings/client/startup/messageTypes.coffee index 6d34cd8c939..7911c68604b 100644 --- a/packages/rocketchat-channel-settings/client/startup/messageTypes.coffee +++ b/packages/rocketchat-channel-settings/client/startup/messageTypes.coffee @@ -19,6 +19,16 @@ Meteor.startup -> room_topic: message.msg } + RocketChat.MessageTypes.registerType + id: 'room_changed_announcement' + system: true + message: 'room_changed_announcement' + data: (message) -> + return { + user_by: message.u?.username + room_announcement: message.msg + } + RocketChat.MessageTypes.registerType id: 'room_changed_description' system: true diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee index 5d37e615521..8939671627c 100644 --- a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee +++ b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee @@ -145,6 +145,17 @@ Template.channelSettings.onCreated -> toastr.success TAPi18n.__ 'Room_topic_changed_successfully' RocketChat.callbacks.run 'roomTopicChanged', room + announcement: + type: 'markdown' + label: 'Announcement' + canView: (room) => true + canEdit: (room) => RocketChat.authz.hasAllPermission('edit-room', room._id) + save: (value, room) -> + Meteor.call 'saveRoomSettings', room._id, 'roomAnnouncement', value, (err, result) -> + return handleError err if err + toastr.success TAPi18n.__ 'Room_announcement_changed_successfully' + RocketChat.callbacks.run 'roomAnnouncementChanged', room + description: type: 'text' label: 'Description' diff --git a/packages/rocketchat-channel-settings/package.js b/packages/rocketchat-channel-settings/package.js index 3f42e734af3..6bfe2c0b87b 100644 --- a/packages/rocketchat-channel-settings/package.js +++ b/packages/rocketchat-channel-settings/package.js @@ -30,6 +30,7 @@ Package.onUse(function(api) { 'server/functions/saveReactWhenReadOnly.js', 'server/functions/saveRoomType.coffee', 'server/functions/saveRoomTopic.coffee', + 'server/functions/saveRoomAnnouncement.js', 'server/functions/saveRoomName.coffee', 'server/functions/saveRoomReadOnly.coffee', 'server/functions/saveRoomDescription.coffee', diff --git a/packages/rocketchat-channel-settings/server/functions/saveRoomAnnouncement.js b/packages/rocketchat-channel-settings/server/functions/saveRoomAnnouncement.js new file mode 100644 index 00000000000..8d230633c21 --- /dev/null +++ b/packages/rocketchat-channel-settings/server/functions/saveRoomAnnouncement.js @@ -0,0 +1,13 @@ +RocketChat.saveRoomAnnouncement = function(rid, roomAnnouncement, user, sendMessage=true) { + if (!Match.test(rid, String)) { + throw new Meteor.Error('invalid-room', 'Invalid room', { function: 'RocketChat.saveRoomAnnouncement' }); + } + + roomAnnouncement = s.escapeHTML(roomAnnouncement); + const updated = RocketChat.models.Rooms.setAnnouncementById(rid, roomAnnouncement); + if (updated && sendMessage) { + RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser('room_changed_announcement', rid, roomAnnouncement, user); + } + + return updated; +} diff --git a/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee index f51a0694945..ee85e795076 100644 --- a/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee +++ b/packages/rocketchat-channel-settings/server/methods/saveRoomSettings.coffee @@ -6,7 +6,7 @@ Meteor.methods unless Match.test rid, String throw new Meteor.Error 'error-invalid-room', 'Invalid room', { method: 'saveRoomSettings' } - if setting not in ['roomName', 'roomTopic', 'roomDescription', 'roomType', 'readOnly', 'reactWhenReadOnly', 'systemMessages', 'default', 'joinCode'] + if setting not in ['roomName', 'roomTopic', 'roomAnnouncement', 'roomDescription', 'roomType', 'readOnly', 'reactWhenReadOnly', 'systemMessages', 'default', 'joinCode'] throw new Meteor.Error 'error-invalid-settings', 'Invalid settings provided', { method: 'saveRoomSettings' } unless RocketChat.authz.hasPermission(Meteor.userId(), 'edit-room', rid) @@ -29,6 +29,9 @@ Meteor.methods when 'roomTopic' if value isnt room.topic RocketChat.saveRoomTopic(rid, value, Meteor.user()) + when 'roomAnnouncement' + if value isnt room.announcement + RocketChat.saveRoomAnnouncement(rid, value, Meteor.user()) when 'roomDescription' if value isnt room.description RocketChat.saveRoomDescription rid, value, Meteor.user() diff --git a/packages/rocketchat-lib/server/models/Rooms.coffee b/packages/rocketchat-lib/server/models/Rooms.coffee index 0830b53f773..928dde42caa 100644 --- a/packages/rocketchat-lib/server/models/Rooms.coffee +++ b/packages/rocketchat-lib/server/models/Rooms.coffee @@ -499,6 +499,16 @@ class ModelRooms extends RocketChat.models._Base return @update query, update + setAnnouncementById: (_id, announcement) -> + query = + _id: _id + + update = + $set: + announcement: announcement + + return @update query, update + muteUsernameByRoomId: (_id, username) -> query = _id: _id diff --git a/packages/rocketchat-piwik/client/trackEvents.js b/packages/rocketchat-piwik/client/trackEvents.js index cd66c66251c..cc2f05636c1 100644 --- a/packages/rocketchat-piwik/client/trackEvents.js +++ b/packages/rocketchat-piwik/client/trackEvents.js @@ -44,6 +44,12 @@ RocketChat.callbacks.add('roomTopicChanged', (room) => { } }, RocketChat.callbacks.priority.MEDIUM, 'piwik-room-topic-changed'); +RocketChat.callbacks.add('roomAnnouncementChanged', (room) => { + if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_rooms')) { + window._paq.push(['trackEvent', 'Room', 'Changed Announcement', room.name + ' (' + room._id + ')' ]); + } +}, RocketChat.callbacks.priority.MEDIUM, 'piwik-room-topic-changed'); + RocketChat.callbacks.add('roomTypeChanged', (room) => { if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_rooms')) { window._paq.push(['trackEvent', 'Room', 'Changed Room Type', room.name + ' (' + room._id + ')' ]); diff --git a/packages/rocketchat-ui-admin/client/rooms/adminRoomInfo.coffee b/packages/rocketchat-ui-admin/client/rooms/adminRoomInfo.coffee index 62cda0ec704..de3cea04e2d 100644 --- a/packages/rocketchat-ui-admin/client/rooms/adminRoomInfo.coffee +++ b/packages/rocketchat-ui-admin/client/rooms/adminRoomInfo.coffee @@ -137,6 +137,13 @@ Template.adminRoomInfo.onCreated -> return handleError(err) toastr.success TAPi18n.__ 'Room_topic_changed_successfully' RocketChat.callbacks.run 'roomTopicChanged', AdminChatRoom.findOne(rid) + when 'roomAnnouncement' + if @validateRoomTopic(rid) + Meteor.call 'saveRoomSettings', rid, 'roomAnnouncement', @$('input[name=roomAnnouncement]').val(), (err, result) -> + if err + return handleError(err) + toastr.success TAPi18n.__ 'Room_announcement_changed_successfully' + RocketChat.callbacks.run 'roomAnnouncementChanged', AdminChatRoom.findOne(rid) when 'roomType' if @validateRoomType(rid) RocketChat.callbacks.run 'roomTypeChanged', AdminChatRoom.findOne(rid) diff --git a/server/publications/room.js b/server/publications/room.js index c665df94131..068e70c4f08 100644 --- a/server/publications/room.js +++ b/server/publications/room.js @@ -7,6 +7,7 @@ const options = { u: 1, // usernames: 1, topic: 1, + announcement: 1, muted: 1, archived: 1, jitsiTimeout: 1, diff --git a/server/startup/roomPublishes.js b/server/startup/roomPublishes.js index fa2eccdf776..0bf9e17c0f3 100644 --- a/server/startup/roomPublishes.js +++ b/server/startup/roomPublishes.js @@ -8,6 +8,7 @@ Meteor.startup(function() { u: 1, usernames: 1, topic: 1, + announcement: 1, muted: 1, archived: 1, ro: 1, @@ -44,6 +45,7 @@ Meteor.startup(function() { u: 1, usernames: 1, topic: 1, + announcement: 1, muted: 1, archived: 1, ro: 1,