diff --git a/client/startup/defaultRoomTypes.coffee b/client/startup/defaultRoomTypes.coffee index b6abf2bede258acdc6ecc9f6efb1337c1aca4e44..9e8305acc1593d67d26a226c6fb46e938668e140 100644 --- a/client/startup/defaultRoomTypes.coffee +++ b/client/startup/defaultRoomTypes.coffee @@ -13,6 +13,13 @@ RocketChat.roomTypes.add 'c', 10, RocketChat.TabBar.showGroup 'channel' link: (sub) -> return { name: sub.name } + findRoom: (identifier) -> + query = + t: 'c' + name: identifier + return ChatRoom.findOne(query) + roomName: (roomData) -> + return roomData.name condition: -> return RocketChat.authz.hasAllPermission 'view-c-room' @@ -27,6 +34,14 @@ RocketChat.roomTypes.add 'd', 20, RocketChat.TabBar.showGroup 'directmessage' link: (sub) -> return { username: sub.name } + findRoom: (identifier, user) -> + query = + t: 'd' + usernames: + $all: [identifier, user.username] + return ChatRoom.findOne(query) + roomName: (roomData) -> + return ChatSubscription.findOne({ rid: roomData._id }, { fields: { name: 1 } })?.name condition: -> return RocketChat.authz.hasAllPermission 'view-d-room' @@ -41,5 +56,12 @@ RocketChat.roomTypes.add 'p', 30, RocketChat.TabBar.showGroup 'privategroup' link: (sub) -> return { name: sub.name } + findRoom: (identifier) -> + query = + t: 'p' + name: identifier + return ChatRoom.findOne(query) + roomName: (roomData) -> + return roomData.name condition: -> return RocketChat.authz.hasAllPermission 'view-p-room' diff --git a/packages/rocketchat-lib/client/lib/openRoom.coffee b/packages/rocketchat-lib/client/lib/openRoom.coffee index 6f2237b0625160b03876507762d7fbefc7f98681..fc432d21e74760f53de88d23deaf9bb1a2ff4ca5 100644 --- a/packages/rocketchat-lib/client/lib/openRoom.coffee +++ b/packages/rocketchat-lib/client/lib/openRoom.coffee @@ -9,23 +9,14 @@ currentTracker = undefined BlazeLayout.render 'main', {center: 'loading'} return - username = Meteor.user()?.username - unless username + user = Meteor.user() + unless user?.username return currentTracker = undefined c.stop() - query = - t: type - name: name - - if type is 'd' - delete query.name - query.usernames = - $all: [name, username] - - room = ChatRoom.findOne(query) + room = RocketChat.roomTypes.findRoom(type, name, user) if not room? if type is 'd' Meteor.call 'createDirectMessage', name, (err) -> diff --git a/packages/rocketchat-lib/client/lib/roomTypes.coffee b/packages/rocketchat-lib/client/lib/roomTypes.coffee index ffc9ba6ff355692111be9690d1df08429f528328..dd76247c66c9e59eb22eda5b86ec9acf4cca996e 100644 --- a/packages/rocketchat-lib/client/lib/roomTypes.coffee +++ b/packages/rocketchat-lib/client/lib/roomTypes.coffee @@ -60,17 +60,26 @@ RocketChat.roomTypes = new class getIcon = (roomType) -> return roomTypes[roomType]?.icon + getRoomName = (roomType, roomData) -> + return roomTypes[roomType]?.roomName roomData + getIdentifiers = (except) -> except = [].concat except list = _.reject roomTypesOrder, (t) -> return except.indexOf(t.identifier) isnt -1 return _.map list, (t) -> return t.identifier + findRoom = (roomType, identifier, user) -> + return roomTypes[roomType]?.findRoom identifier, user + # addType: addType getTypes: getAllTypes getIdentifiers: getIdentifiers + findRoom: findRoom + # setIcon: setIcon getIcon: getIcon + getRoomName: getRoomName # setRoute: setRoute getRouteLink: getRouteLink diff --git a/packages/rocketchat-lib/i18n/en.i18n.json b/packages/rocketchat-lib/i18n/en.i18n.json index 6c1ea61082597857bfe98e191f5b26103f17aaf9..4846fd599260d87ee2449c5068f5d2409a871bd2 100644 --- a/packages/rocketchat-lib/i18n/en.i18n.json +++ b/packages/rocketchat-lib/i18n/en.i18n.json @@ -573,6 +573,7 @@ "Livechat_enabled" : "Livechat enabled", "Livechat_guest_count" : "Guest Counter", "Livechat_managers" : "Livechat managers", + "Livechat_Room_Count" : "Livechat Room Count", "Livechat_title" : "Livechat Title", "Livechat_title_color" : "Livechat Title Background Color", "Livechat_Users" : "Livechat Users", diff --git a/packages/rocketchat-livechat/app/client/lib/_visitor.coffee b/packages/rocketchat-livechat/app/client/lib/_visitor.coffee index 9bb1e6ca7d1002ec2649bd493c42149a8fb7754f..c758998ea0871ee3d18dafb633fbdefb63a6f620 100644 --- a/packages/rocketchat-livechat/app/client/lib/_visitor.coffee +++ b/packages/rocketchat-livechat/app/client/lib/_visitor.coffee @@ -1,3 +1,5 @@ +msgStream = new Meteor.Streamer 'room-messages' + @visitor = new class token = new ReactiveVar null room = new ReactiveVar null @@ -30,9 +32,20 @@ room.set(rid) return roomToSubscribe.set(rid) + subscribeToRoom = (roomId) -> + msgStream.on roomId, (msg) -> + if msg.t is 'command' + if msg.msg is 'survey' + unless $('body #survey').length + Blaze.render(Template.survey, $('body').get(0)) + else + ChatMessage.upsert { _id: msg._id }, msg + register: register getToken: getToken setRoom: setRoom getRoom: getRoom setRoomToSubscribe: setRoomToSubscribe getRoomToSubscribe: getRoomToSubscribe + + subscribeToRoom: subscribeToRoom diff --git a/packages/rocketchat-livechat/app/client/lib/chatMessages.coffee b/packages/rocketchat-livechat/app/client/lib/chatMessages.coffee index 9ca165e660d7e251671d64cab5fb64d15545d799..e46e519bc440d34b3b27462223e7d0c7b2fe8f12 100644 --- a/packages/rocketchat-livechat/app/client/lib/chatMessages.coffee +++ b/packages/rocketchat-livechat/app/client/lib/chatMessages.coffee @@ -106,7 +106,8 @@ class @ChatMessages sendMessage (message) -> ChatMessage.update message._id, _.omit(message, '_id') if message.rid? - visitor.setRoomToSubscribe(message.rid) + visitor.subscribeToRoom(message.rid) + visitor.setRoom(message.rid) else sendMessage() diff --git a/packages/rocketchat-livechat/app/client/lib/collections.coffee b/packages/rocketchat-livechat/app/client/lib/collections.coffee index c86ad59f9dde87d990bf26b7e8aa5ef400b6fc53..12be8dafa5607a1dae5ee8c01368167de9fdaa97 100644 --- a/packages/rocketchat-livechat/app/client/lib/collections.coffee +++ b/packages/rocketchat-livechat/app/client/lib/collections.coffee @@ -1,5 +1,2 @@ @ChatMessage = new Meteor.Collection null -@ChatRoom = new Meteor.Collection 'rocketchat_room' -@Settings = new Meteor.Collection 'rocketchat_settings' -@Trigger = new Meteor.Collection 'rocketchat_livechat_trigger' -@Department = new Meteor.Collection 'rocketchat_livechat_department' +@Department = new Meteor.Collection null diff --git a/packages/rocketchat-livechat/app/client/lib/fromApp/Notifications.coffee b/packages/rocketchat-livechat/app/client/lib/fromApp/Notifications.coffee index 56a4585af5dffad8c65e0b998460696dc734d5e9..9fd588378e23cb1f64d947a378ad812c7a79f4c1 100644 --- a/packages/rocketchat-livechat/app/client/lib/fromApp/Notifications.coffee +++ b/packages/rocketchat-livechat/app/client/lib/fromApp/Notifications.coffee @@ -22,17 +22,6 @@ args.unshift "#{userId}/#{eventName}" @streamUser.emit.apply @streamUser, args - notifyUsersOfRoom: (room, eventName, args...) -> - console.log "RocketChat.Notifications: notifyUsersOfRoom", arguments if @debug is true - - onlineUsers = RoomManager.onlineUsers.get() - room = ChatRoom.findOne(room) - for username in room?.usernames or [] - if onlineUsers[username]? - argsToSend = ["#{onlineUsers[username]._id}/#{eventName}"].concat args - @streamUser.emit.apply @streamUser, argsToSend - - onAll: (eventName, callback) -> @streamAll.on eventName, callback diff --git a/packages/rocketchat-livechat/app/client/lib/triggers.js b/packages/rocketchat-livechat/app/client/lib/triggers.js index 1ea4fcf9876c426bc18b0c96c596b7f765c859ba..0e7eccde0b07b15e74a0a10270a9cf76e64a9f63 100644 --- a/packages/rocketchat-livechat/app/client/lib/triggers.js +++ b/packages/rocketchat-livechat/app/client/lib/triggers.js @@ -5,7 +5,7 @@ this.Triggers = (function() { var fire = function(actions) { if (Meteor.userId()) { - console.log('already logged user - does nothing'); + // console.log('already logged user - does nothing'); return; } actions.forEach(function(action) { @@ -57,23 +57,25 @@ this.Triggers = (function() { }); }; + var setTriggers = function(newTriggers) { + triggers = newTriggers; + }; + var init = function() { initiated = true; - Tracker.autorun(function() { - triggers = Trigger.find().fetch(); - if (requests.length > 0 && triggers.length > 0) { - requests.forEach(function(request) { - processRequest(request); - }); + if (requests.length > 0 && triggers.length > 0) { + requests.forEach(function(request) { + processRequest(request); + }); - requests = []; - } - }); + requests = []; + } }; return { init: init, - processRequest: processRequest + processRequest: processRequest, + setTriggers: setTriggers }; }()); diff --git a/packages/rocketchat-livechat/app/client/startup/room.coffee b/packages/rocketchat-livechat/app/client/startup/room.coffee deleted file mode 100644 index cc1e9bfddb39858c06c0e19f7164385c13eceef1..0000000000000000000000000000000000000000 --- a/packages/rocketchat-livechat/app/client/startup/room.coffee +++ /dev/null @@ -1,10 +0,0 @@ -msgStream = new Meteor.Streamer 'room-messages' -Tracker.autorun -> - if visitor.getRoomToSubscribe()? - msgStream.on visitor.getRoomToSubscribe(), (msg) -> - if msg.t is 'command' - if msg.msg is 'survey' - unless $('body #survey').length - Blaze.render(Template.survey, $('body').get(0)) - else - ChatMessage.upsert { _id: msg._id }, msg diff --git a/packages/rocketchat-livechat/app/client/startup/triggers.js b/packages/rocketchat-livechat/app/client/startup/triggers.js deleted file mode 100644 index bb62aee128297bf34f875344e28b712475e07845..0000000000000000000000000000000000000000 --- a/packages/rocketchat-livechat/app/client/startup/triggers.js +++ /dev/null @@ -1,5 +0,0 @@ -Meteor.startup(function() { - Meteor.subscribe('livechat:trigger', function() { - Triggers.init(); - }); -}); diff --git a/packages/rocketchat-livechat/app/client/views/livechatWindow.js b/packages/rocketchat-livechat/app/client/views/livechatWindow.js index 3ee2fb5c661b2f441be8d1eddbf43979ddfbf32b..4c397091e51bb7f87f6771ee0c1be264b687b3b8 100644 --- a/packages/rocketchat-livechat/app/client/views/livechatWindow.js +++ b/packages/rocketchat-livechat/app/client/views/livechatWindow.js @@ -1,17 +1,10 @@ +/* globals Department */ Template.livechatWindow.helpers({ title() { - var ref; - if (!Template.instance().subscriptionsReady()) { - return ''; - } - return ((ref = Settings.findOne('Livechat_title')) != null ? ref.value : void 0) || 'Rocket.Chat'; + return Template.instance().title.get(); }, color() { - var ref; - if (!Template.instance().subscriptionsReady()) { - return 'transparent'; - } - return ((ref = Settings.findOne('Livechat_title_color')) != null ? ref.value : void 0) || '#C1272D'; + return Template.instance().color.get(); }, popoutActive() { return FlowRouter.getQueryParam('mode') === 'popout'; @@ -20,14 +13,13 @@ Template.livechatWindow.helpers({ if (Session.get('triggered') || Meteor.userId()) { return false; } - var form = Settings.findOne('Livechat_registration_form'); - return form.value; + return Template.instance().registrationForm.get(); }, livechatStartedEnabled() { - return Template.instance().startedEnabled.get() !== null; + return Template.instance().enabled.get() !== null; }, livechatEnabled() { - return Template.instance().startedEnabled.get(); + return Template.instance().enabled.get(); } }); @@ -42,22 +34,37 @@ Template.livechatWindow.events({ }); Template.livechatWindow.onCreated(function() { - this.startedEnabled = new ReactiveVar(null); + this.enabled = new ReactiveVar(null); - this.subscribe('settings', ['Livechat_title', 'Livechat_title_color', 'Livechat_enabled', 'Livechat_registration_form']); + this.title = new ReactiveVar('Rocket.Chat'); + this.color = new ReactiveVar('#C1272D'); + this.registrationForm = new ReactiveVar(true); - var initialCheck = true; + // get all needed live chat info for the user + Meteor.call('livechat:getInitialData', visitor.getToken(), (err, result) => { + if (err) { + console.error(err); + } else { + if (!result.enabled) { + return parentCall('removeWidget'); + } + this.enabled.set(result.enabled); + this.title.set(result.title); + this.color.set(result.color); + this.registrationForm.set(result.registrationForm); - this.autorun(() => { - if (this.subscriptionsReady()) { - var enabled = Settings.findOne('Livechat_enabled'); - if (enabled !== undefined) { - if (!enabled.value && initialCheck) { - parentCall('removeWidget'); - } - initialCheck = false; - this.startedEnabled.set(enabled.value); + if (result.room) { + RoomHistoryManager.getMoreIfIsEmpty(result.room._id); + visitor.subscribeToRoom(result.room._id); + visitor.setRoom(result.room._id); } + + Triggers.setTriggers(result.triggers); + Triggers.init(); + + result.departments.forEach((department) => { + Department.insert(department); + }); } }); }); diff --git a/packages/rocketchat-livechat/app/client/views/messages.js b/packages/rocketchat-livechat/app/client/views/messages.js index 3098953b8c7bfd0a587f3cc766e5643e7bcec2b2..e9d0312cc02c2bbc7191851938d6117e7fcb704c 100644 --- a/packages/rocketchat-livechat/app/client/views/messages.js +++ b/packages/rocketchat-livechat/app/client/views/messages.js @@ -41,16 +41,7 @@ Template.messages.events({ Template.messages.onCreated(function() { var self; self = this; - self.autorun(function() { - self.subscribe('livechat:visitorRoom', visitor.getToken(), function() { - var room; - room = ChatRoom.findOne(); - if (room != null) { - visitor.setRoomToSubscribe(room._id); - RoomHistoryManager.getMoreIfIsEmpty(room._id); - } - }); - }); + self.atBottom = true; self.updateMessageInputHeight = function(input) { diff --git a/packages/rocketchat-livechat/app/client/views/register.js b/packages/rocketchat-livechat/app/client/views/register.js index b95bb8549766f617a265bfce384fb9507b66dd72..fea2092edc4d4f051c20ec78adbe65914349713b 100644 --- a/packages/rocketchat-livechat/app/client/views/register.js +++ b/packages/rocketchat-livechat/app/client/views/register.js @@ -54,8 +54,6 @@ Template.register.events({ }); Template.register.onCreated(function() { - this.subscribe('livechat:availableDepartments'); - this.error = new ReactiveVar(); this.showError = (msg) => { $('.error').addClass('show'); diff --git a/packages/rocketchat-livechat/client/ui.js b/packages/rocketchat-livechat/client/ui.js index f23113ac8d30b37f8bf6a7fd313660d68717b4c0..843dfffafc12f79213beddd1e478976b37bb66b0 100644 --- a/packages/rocketchat-livechat/client/ui.js +++ b/packages/rocketchat-livechat/client/ui.js @@ -5,17 +5,26 @@ RocketChat.roomTypes.add('l', 5, { icon: 'icon-chat-empty', route: { name: 'live', - path: '/live/:name', - action: (params/*, queryParams*/) => { - openRoom('l', params.name); + path: '/live/:code(\\d+)', + action(params/*, queryParams*/) { + openRoom('l', params.code); RocketChat.TabBar.showGroup('livechat', 'search'); }, - link: (sub) => { + link(sub) { return { - name: sub.name + code: sub.code }; } }, + + findRoom(identifier) { + return ChatRoom.findOne({ code: parseInt(identifier) }); + }, + + roomName(roomData) { + return roomData.name; + }, + condition: () => { return RocketChat.settings.get('Livechat_enabled') && RocketChat.authz.hasAllPermission('view-l-room'); } diff --git a/packages/rocketchat-livechat/config.js b/packages/rocketchat-livechat/config.js index 36fdd74384b534e76ad041a0c93de92a51c6213f..d717b58023c3cace137ba5e41be72f2fb1c6dd73 100644 --- a/packages/rocketchat-livechat/config.js +++ b/packages/rocketchat-livechat/config.js @@ -6,6 +6,11 @@ Meteor.startup(function() { RocketChat.settings.add('Livechat_registration_form', true, { type: 'boolean', group: 'Livechat', public: true, i18nLabel: 'Show_preregistration_form' }); RocketChat.settings.add('Livechat_guest_count', 1, { type: 'int', group: 'Livechat' }); + RocketChat.settings.add('Livechat_Room_Count', 1, { + type: 'int', + group: 'Livechat' + }); + RocketChat.settings.add('Livechat_Knowledge_Enabled', false, { type: 'boolean', group: 'Livechat', diff --git a/packages/rocketchat-livechat/package.js b/packages/rocketchat-livechat/package.js index 7f9d5806643e5e5a1bbffb7e1737f1d47c5824e1..f871ca392f428b50a343bbf010a2adb5e6856446 100644 --- a/packages/rocketchat-livechat/package.js +++ b/packages/rocketchat-livechat/package.js @@ -99,6 +99,7 @@ Package.onUse(function(api) { api.addFiles('server/methods/addManager.js', 'server'); api.addFiles('server/methods/changeLivechatStatus.js', 'server'); api.addFiles('server/methods/getCustomFields.js', 'server'); + api.addFiles('server/methods/getInitialData.js', 'server'); api.addFiles('server/methods/pageVisited.js', 'server'); api.addFiles('server/methods/registerGuest.js', 'server'); api.addFiles('server/methods/removeAgent.js', 'server'); @@ -124,6 +125,7 @@ Package.onUse(function(api) { api.addFiles('server/models/LivechatDepartmentAgents.js', 'server'); api.addFiles('server/models/LivechatPageVisited.js', 'server'); api.addFiles('server/models/LivechatTrigger.js', 'server'); + api.addFiles('server/models/indexes.js', 'server'); // server lib api.addFiles('server/lib/Livechat.js', 'server'); @@ -131,7 +133,6 @@ Package.onUse(function(api) { api.addFiles('server/externalMessageHook.js', 'server'); // publications - api.addFiles('server/publications/availableDepartments.js', 'server'); api.addFiles('server/publications/customFields.js', 'server'); api.addFiles('server/publications/departmentAgents.js', 'server'); api.addFiles('server/publications/externalMessages.js', 'server'); @@ -139,10 +140,8 @@ Package.onUse(function(api) { api.addFiles('server/publications/livechatDepartments.js', 'server'); api.addFiles('server/publications/livechatManagers.js', 'server'); api.addFiles('server/publications/livechatRooms.js', 'server'); - api.addFiles('server/publications/trigger.js', 'server'); api.addFiles('server/publications/visitorInfo.js', 'server'); api.addFiles('server/publications/visitorPageVisited.js', 'server'); - api.addFiles('server/publications/visitorRoom.js', 'server'); // api api.addFiles('server/api.js', 'server'); diff --git a/packages/rocketchat-livechat/server/lib/Livechat.js b/packages/rocketchat-livechat/server/lib/Livechat.js index 8c9726854e4e9f26eed1b1a25b9148e67a816548..54902e579e1d185097fd9ab504da96533ab8c2ff 100644 --- a/packages/rocketchat-livechat/server/lib/Livechat.js +++ b/packages/rocketchat-livechat/server/lib/Livechat.js @@ -24,11 +24,15 @@ RocketChat.Livechat = { if (!agent) { throw new Meteor.Error('no-agent-online', 'Sorry, no online agents'); } - let roomData = _.extend({ + + const roomCode = RocketChat.models.Rooms.getNextLivechatRoomCode(); + + room = _.extend({ _id: message.rid, name: guest.username, msgs: 1, lm: new Date(), + code: roomCode, usernames: [agent.username, guest.username], t: 'l', ts: new Date(), @@ -43,6 +47,7 @@ RocketChat.Livechat = { open: true, unread: 1, answered: false, + code: roomCode, u: { _id: agent.agentId, username: agent.username @@ -53,10 +58,11 @@ RocketChat.Livechat = { emailNotifications: 'all' }; - RocketChat.models.Rooms.insert(roomData); + RocketChat.models.Rooms.insert(room); RocketChat.models.Subscriptions.insert(subscriptionData); + } else { + room = Meteor.call('canAccessRoom', message.rid, guest._id); } - room = Meteor.call('canAccessRoom', message.rid, guest._id); if (!room) { throw new Meteor.Error('cannot-acess-room'); } diff --git a/packages/rocketchat-livechat/server/methods/getInitialData.js b/packages/rocketchat-livechat/server/methods/getInitialData.js new file mode 100644 index 0000000000000000000000000000000000000000..d0ee953fffb2bf76c1999cb993d4743c0b23ab6c --- /dev/null +++ b/packages/rocketchat-livechat/server/methods/getInitialData.js @@ -0,0 +1,55 @@ +Meteor.methods({ + 'livechat:getInitialData'(visitorToken) { + var info = { + enabled: null, + title: null, + color: null, + registrationForm: null, + room: null, + triggers: [], + departments: [] + }; + + const room = RocketChat.models.Rooms.findByVisitorToken(visitorToken, { + fields: { + name: 1, + t: 1, + cl: 1, + u: 1, + usernames: 1, + v: 1 + } + }).fetch(); + + if (room && room.length > 0) { + info.room = room[0]; + } + + RocketChat.models.Settings.findNotHiddenPublic([ + 'Livechat_title', + 'Livechat_title_color', + 'Livechat_enabled', + 'Livechat_registration_form' + ]).forEach((setting) => { + if (setting._id === 'Livechat_title') { + info.title = setting.value; + } else if (setting._id === 'Livechat_title_color') { + info.color = setting.value; + } else if (setting._id === 'Livechat_enabled') { + info.enabled = setting.value; + } else if (setting._id === 'Livechat_registration_form') { + info.registrationForm = setting.value; + } + }); + + RocketChat.models.LivechatTrigger.find().forEach((trigger) => { + info.triggers.push(trigger); + }); + + RocketChat.models.LivechatDepartment.findEnabledWithAgents().forEach((department) => { + info.departments.push(department); + }); + + return info; + } +}); diff --git a/packages/rocketchat-livechat/server/models/Rooms.js b/packages/rocketchat-livechat/server/models/Rooms.js index 4aaf199eb2ecb09a5c79b6f083235641789b2817..cb11ec19d59a64f9ad88880a49744316aab24cbf 100644 --- a/packages/rocketchat-livechat/server/models/Rooms.js +++ b/packages/rocketchat-livechat/server/models/Rooms.js @@ -37,3 +37,41 @@ RocketChat.models.Rooms.findLivechat = function(offset = 0, limit = 20) { return this.find(query, { sort: { ts: - 1 }, offset: offset, limit: limit }); }; + +RocketChat.models.Rooms.findLivechatByCode = function(code, fields) { + const query = { + t: 'l', + code: parseInt(code) + }; + + let options = {}; + + if (fields) { + options.fields = fields; + } + + return this.find(query, options); +}; + +/** + * Get the next visitor name + * @return {string} The next visitor name + */ +RocketChat.models.Rooms.getNextLivechatRoomCode = function() { + const settingsRaw = RocketChat.models.Settings.model.rawCollection(); + const findAndModify = Meteor.wrapAsync(settingsRaw.findAndModify, settingsRaw); + + const query = { + _id: 'Livechat_Room_Count' + }; + + const update = { + $inc: { + value: 1 + } + }; + + const livechatCount = findAndModify(query, null, update); + + return livechatCount.value; +}; diff --git a/packages/rocketchat-livechat/server/models/indexes.js b/packages/rocketchat-livechat/server/models/indexes.js new file mode 100644 index 0000000000000000000000000000000000000000..c40e3bf6b3065db4b19de4821a878d24bc28ec4f --- /dev/null +++ b/packages/rocketchat-livechat/server/models/indexes.js @@ -0,0 +1,3 @@ +Meteor.startup(function() { + RocketChat.models.Rooms.tryEnsureIndex({ code: 1 }); +}); diff --git a/packages/rocketchat-livechat/server/publications/availableDepartments.js b/packages/rocketchat-livechat/server/publications/availableDepartments.js deleted file mode 100644 index 6ab277d73cecdcf214c4a1dea6644738762bf3f4..0000000000000000000000000000000000000000 --- a/packages/rocketchat-livechat/server/publications/availableDepartments.js +++ /dev/null @@ -1,3 +0,0 @@ -Meteor.publish('livechat:availableDepartments', function() { - return RocketChat.models.LivechatDepartment.findEnabledWithAgents(); -}); diff --git a/packages/rocketchat-livechat/server/publications/trigger.js b/packages/rocketchat-livechat/server/publications/trigger.js deleted file mode 100644 index 61d7d6831f41d0013ff2e1efc106b24d907eb86a..0000000000000000000000000000000000000000 --- a/packages/rocketchat-livechat/server/publications/trigger.js +++ /dev/null @@ -1,3 +0,0 @@ -Meteor.publish('livechat:trigger', function() { - return RocketChat.models.LivechatTrigger.find(); -}); diff --git a/packages/rocketchat-livechat/server/publications/visitorRoom.js b/packages/rocketchat-livechat/server/publications/visitorRoom.js deleted file mode 100644 index cb0570f7a7e8a736605bd737100a00c0395b475f..0000000000000000000000000000000000000000 --- a/packages/rocketchat-livechat/server/publications/visitorRoom.js +++ /dev/null @@ -1,12 +0,0 @@ -Meteor.publish('livechat:visitorRoom', function(visitorToken) { - return RocketChat.models.Rooms.findByVisitorToken(visitorToken, { - fields: { - name: 1, - t: 1, - cl: 1, - u: 1, - usernames: 1, - v: 1 - } - }); -}); diff --git a/packages/rocketchat-livechat/server/startup.js b/packages/rocketchat-livechat/server/startup.js index 58cee3def1365a8083296ac85ec025d4df07ec38..84ae762288107ea8aaa5c9ba7ee0514203a85892 100644 --- a/packages/rocketchat-livechat/server/startup.js +++ b/packages/rocketchat-livechat/server/startup.js @@ -1,18 +1,17 @@ Meteor.startup(() => { - RocketChat.roomTypes.setPublish('l', (identifier) => { - return RocketChat.models.Rooms.findByTypeAndName('l', identifier, { - fields: { - name: 1, - t: 1, - cl: 1, - u: 1, - usernames: 1, - v: 1, - livechatData: 1, - topic: 1, - tags: 1, - sms: 1 - } + RocketChat.roomTypes.setPublish('l', (code) => { + return RocketChat.models.Rooms.findLivechatByCode(code, { + name: 1, + t: 1, + cl: 1, + u: 1, + usernames: 1, + v: 1, + livechatData: 1, + topic: 1, + tags: 1, + sms: 1, + code: 1 }); }); diff --git a/packages/rocketchat-ui/lib/RoomManager.coffee b/packages/rocketchat-ui/lib/RoomManager.coffee index 6b0c9afca095699de8263a3441f2b1f2ea5f7a9c..07c1d32a1bca7b30edc9378065c61987a2d6fdcd 100644 --- a/packages/rocketchat-ui/lib/RoomManager.coffee +++ b/packages/rocketchat-ui/lib/RoomManager.coffee @@ -86,9 +86,8 @@ RocketChat.Notifications.onUser 'message', (msg) -> for typeName, record of openedRooms when record.active is true do (typeName, record) -> - username = Meteor.user()?.username - - unless username + user = Meteor.user() + unless user?.username return record.sub = [ @@ -104,15 +103,8 @@ RocketChat.Notifications.onUser 'message', (msg) -> type = typeName.substr(0, 1) name = typeName.substr(1) - query = - t: type - - if type is 'd' - query.usernames = $all: [username, name] - else - query.name = name - - room = ChatRoom.findOne query, { reactive: false } + room = Tracker.nonreactive => + return RocketChat.roomTypes.findRoom(type, name, user) if not room? record.ready = true diff --git a/packages/rocketchat-ui/views/app/room.coffee b/packages/rocketchat-ui/views/app/room.coffee index ead835fd5c9cd91661e49126aa7907d41605578c..1643f28db5609a1e4aeac6d34cbdfe05dccc417c 100644 --- a/packages/rocketchat-ui/views/app/room.coffee +++ b/packages/rocketchat-ui/views/app/room.coffee @@ -74,10 +74,7 @@ Template.room.helpers roomData = Session.get('roomData' + this._id) return '' unless roomData - if roomData.t is 'd' - return ChatSubscription.findOne({ rid: this._id }, { fields: { name: 1 } })?.name - else - return roomData.name + return RocketChat.roomTypes.getRoomName roomData?.t, roomData roomTopic: -> roomData = Session.get('roomData' + this._id) @@ -88,10 +85,7 @@ Template.room.helpers roomData = Session.get('roomData' + this._id) return '' unless roomData?.t - switch roomData.t - when 'd' then return 'icon-at' - when 'c' then return 'icon-hash' - when 'p' then return 'icon-lock' + return RocketChat.roomTypes.getIcon roomData?.t userStatus: -> roomData = Session.get('roomData' + this._id) diff --git a/server/publications/subscription.coffee b/server/publications/subscription.coffee index 08c3001d5683fc2de8ad98e534b585fa98b7b3b0..7ad7accceca3d78aaeb0cb7f0a2073c0054da883 100644 --- a/server/publications/subscription.coffee +++ b/server/publications/subscription.coffee @@ -9,6 +9,7 @@ Meteor.publish 'subscription', -> ls: 1 name: 1 rid: 1 + code: 1 f: 1 open: 1 alert: 1 diff --git a/server/startup/migrations/v049.js b/server/startup/migrations/v049.js new file mode 100644 index 0000000000000000000000000000000000000000..90392b509c9f894f80927cadf1cf1313f04570c9 --- /dev/null +++ b/server/startup/migrations/v049.js @@ -0,0 +1,21 @@ +RocketChat.Migrations.add({ + version: 49, + up: function() { + + var count = 1; + + RocketChat.models.Rooms.find({ t: 'l' }, { sort: { ts: 1 }, fields: { _id: 1 } }).forEach(function(room) { + RocketChat.models.Rooms.update({ _id: room._id }, { $set: { code: count } }); + RocketChat.models.Subscriptions.update({ rid: room._id }, { $set: { code: count } }, { multi: true }); + count++; + }); + + RocketChat.models.Settings.upsert({ _id: 'Livechat_Room_Count' }, { + $set: { + value: count, + type: 'int', + group: 'Livechat' + } + }); + } +});