Merge branch 'develop' into subscription-audio-notification

# Conflicts:
#	server/startup/migrations/v084.js
pull/5366/head
Marcelo Schmidt 8 years ago
commit 8249b96d58
No known key found for this signature in database
GPG Key ID: CA48C21A7B66097E
  1. 6
      .eslintrc
  2. 2
      README.md
  3. 2
      client/startup/unread.js
  4. 5
      package.json
  5. 3
      packages/meteor-accounts-saml/package.js
  6. 3
      packages/meteor-accounts-saml/saml_utils.js
  7. 3
      packages/rocketchat-api/package.js
  8. 18
      packages/rocketchat-api/server/api.js
  9. 2
      packages/rocketchat-api/server/settings.js
  10. 44
      packages/rocketchat-api/server/v1/stats.js
  11. 4
      packages/rocketchat-authorization/server/startup.coffee
  12. 10
      packages/rocketchat-bot-helpers/server/index.js
  13. 10
      packages/rocketchat-channel-settings/client/startup/trackSettingsChange.js
  14. 4
      packages/rocketchat-crowd/server/crowd.js
  15. 12
      packages/rocketchat-emoji-custom/admin/adminEmoji.js
  16. 16
      packages/rocketchat-emoji-custom/admin/emojiEdit.js
  17. 20
      packages/rocketchat-emoji-custom/admin/emojiInfo.js
  18. 42
      packages/rocketchat-emoji-custom/client/lib/emojiCustom.js
  19. 16
      packages/rocketchat-emoji-custom/server/methods/insertOrUpdateEmoji.js
  20. 6
      packages/rocketchat-emoji-custom/server/methods/uploadEmojiCustom.js
  21. 10
      packages/rocketchat-emoji-custom/server/models/EmojiCustom.js
  22. 6
      packages/rocketchat-emoji-custom/server/publications/fullEmojiData.js
  23. 16
      packages/rocketchat-emoji-custom/server/startup/emoji-custom.js
  24. 4
      packages/rocketchat-emoji-emojione/rocketchat.js
  25. 2
      packages/rocketchat-emoji/emojiButton.js
  26. 6
      packages/rocketchat-emoji/emojiParser.js
  27. 44
      packages/rocketchat-emoji/emojiPicker.js
  28. 24
      packages/rocketchat-emoji/lib/EmojiPicker.js
  29. 8
      packages/rocketchat-emoji/lib/emojiRenderer.js
  30. 6
      packages/rocketchat-error-handler/server/lib/RocketChat.ErrorHandler.js
  31. 4
      packages/rocketchat-file-upload/client/lib/FileUploadFileSystem.js
  32. 4
      packages/rocketchat-file-upload/client/lib/FileUploadGridFS.js
  33. 6
      packages/rocketchat-file-upload/server/config/configFileUploadAmazonS3.js
  34. 17
      packages/rocketchat-i18n/i18n/cs.i18n.json
  35. 11
      packages/rocketchat-i18n/i18n/en.i18n.json
  36. 32
      packages/rocketchat-importer-csv/server.js
  37. 46
      packages/rocketchat-importer-hipchat-enterprise/server.js
  38. 14
      packages/rocketchat-integrations/server/api/api.coffee
  39. 6
      packages/rocketchat-ldap/server/ldap.js
  40. 2
      packages/rocketchat-ldap/server/loginHandler.js
  41. 14
      packages/rocketchat-ldap/server/sync.js
  42. 10
      packages/rocketchat-lib/client/lib/TabBar.js
  43. 2
      packages/rocketchat-lib/client/lib/userRoles.js
  44. 2
      packages/rocketchat-lib/lib/getURL.js
  45. 4
      packages/rocketchat-lib/server/functions/addUserToDefaultChannels.js
  46. 6
      packages/rocketchat-lib/server/functions/addUserToRoom.js
  47. 8
      packages/rocketchat-lib/server/functions/createPrivateGroup.js
  48. 8
      packages/rocketchat-lib/server/functions/createRoom.js
  49. 4
      packages/rocketchat-lib/server/functions/deleteMessage.js
  50. 2
      packages/rocketchat-lib/server/functions/deleteUser.js
  51. 4
      packages/rocketchat-lib/server/functions/removeUserFromRoom.js
  52. 8
      packages/rocketchat-lib/server/functions/saveCustomFields.js
  53. 8
      packages/rocketchat-lib/server/functions/saveUser.js
  54. 6
      packages/rocketchat-lib/server/functions/setUserAvatar.js
  55. 6
      packages/rocketchat-lib/server/functions/updateMessage.js
  56. 4
      packages/rocketchat-lib/server/lib/PushNotification.js
  57. 2
      packages/rocketchat-lib/server/lib/bugsnag.js
  58. 10
      packages/rocketchat-lib/server/lib/notifyUsersOnMessage.js
  59. 38
      packages/rocketchat-lib/server/methods/addUserToRoom.js
  60. 67
      packages/rocketchat-lib/server/methods/addUsersToRoom.js
  61. 4
      packages/rocketchat-lib/server/methods/filterATAllTag.js
  62. 4
      packages/rocketchat-lib/server/methods/getUserRoles.js
  63. 2
      packages/rocketchat-lib/server/methods/leaveRoom.js
  64. 1
      packages/rocketchat-lib/server/models/Messages.coffee
  65. 10
      packages/rocketchat-lib/server/models/Rooms.coffee
  66. 14
      packages/rocketchat-lib/server/models/_BaseCache.js
  67. 10
      packages/rocketchat-lib/server/models/_BaseDb.js
  68. 2
      packages/rocketchat-livechat/app/client/lib/LivechatVideoCall.js
  69. 2
      packages/rocketchat-livechat/app/client/lib/commands.js
  70. 2
      packages/rocketchat-livechat/app/client/stylesheets/utils/_variables.import.less
  71. 2
      packages/rocketchat-livechat/app/client/views/livechatWindow.js
  72. 9
      packages/rocketchat-livechat/app/client/views/messages.js
  73. 2
      packages/rocketchat-livechat/app/client/views/offlineForm.js
  74. 2
      packages/rocketchat-livechat/app/client/views/register.js
  75. 2
      packages/rocketchat-livechat/client/methods/changeLivechatStatus.js
  76. 2
      packages/rocketchat-livechat/client/views/app/livechatCurrentChats.js
  77. 2
      packages/rocketchat-livechat/client/views/app/livechatDepartmentForm.js
  78. 2
      packages/rocketchat-livechat/client/views/app/livechatInstallation.js
  79. 20
      packages/rocketchat-livechat/client/views/app/livechatIntegrations.js
  80. 12
      packages/rocketchat-livechat/client/views/app/livechatQueue.js
  81. 4
      packages/rocketchat-livechat/client/views/app/tabbar/visitorEdit.js
  82. 14
      packages/rocketchat-livechat/client/views/app/tabbar/visitorInfo.js
  83. 4
      packages/rocketchat-livechat/imports/server/rest/sms.js
  84. 2
      packages/rocketchat-livechat/imports/server/rest/users.js
  85. 2
      packages/rocketchat-livechat/livechat.js
  86. 2
      packages/rocketchat-livechat/roomType.js
  87. 2
      packages/rocketchat-livechat/server/hooks/markRoomResponded.js
  88. 2
      packages/rocketchat-livechat/server/hooks/offlineMessage.js
  89. 4
      packages/rocketchat-livechat/server/hooks/sendToCRM.js
  90. 16
      packages/rocketchat-livechat/server/lib/Livechat.js
  91. 2
      packages/rocketchat-livechat/server/lib/QueueMethods.js
  92. 2
      packages/rocketchat-livechat/server/methods/changeLivechatStatus.js
  93. 2
      packages/rocketchat-livechat/server/methods/closeByVisitor.js
  94. 2
      packages/rocketchat-livechat/server/methods/loginByToken.js
  95. 2
      packages/rocketchat-livechat/server/methods/registerGuest.js
  96. 4
      packages/rocketchat-livechat/server/methods/startVideoCall.js
  97. 4
      packages/rocketchat-livechat/server/methods/webhookTest.js
  98. 4
      packages/rocketchat-livechat/server/models/LivechatDepartmentAgents.js
  99. 2
      packages/rocketchat-livechat/server/models/Rooms.js
  100. 4
      packages/rocketchat-livechat/server/models/Users.js
  101. Some files were not shown because too many files have changed in this diff Show More

@ -1,6 +1,7 @@
{
"parserOptions": {
"sourceType": "module"
"sourceType": "module",
"ecmaVersion": 2017
},
"env": {
"browser": true,
@ -73,7 +74,8 @@
"valid-typeof": 2,
"linebreak-style": [2, "unix"],
"quotes": [2, "single"],
"semi": [2, "always"]
"semi": [2, "always"],
"prefer-const": 2
},
"globals": {
"_" : false,

@ -87,6 +87,8 @@ sudo snap install rocketchat-server
Installing snaps is very quick. By running that command you have your full Rocket.Chat server up and running. Snaps are secure. They are isolated with all of their dependencies. Snaps also auto update when we release new versions.
Our snap features a built-in reverse proxy that can request and maintain free letsencrypt SSL certificates. You can go from zero to a public-facing SSL-secured Rocket.Chat server in less than 5 minutes.
Find out more information about our snaps [here](https://rocket.chat/docs/installation/manual-installation/ubuntu/snaps/)
## Sandstorm.io

@ -14,7 +14,7 @@ Meteor.startup(function() {
}
});
for (let subscription of subscriptions.fetch()) {
for (const subscription of subscriptions.fetch()) {
fireGlobalEvent('unread-changed-by-subscription', subscription);
if (subscription.alert || subscription.unread > 0) {

@ -36,6 +36,7 @@
"scripts": {
"start": "meteor npm i && meteor",
"lint": "eslint .",
"lint-fix": "eslint . --fix",
"stylelint": "stylelint **/*.less",
"test": "node .scripts/start.js",
"deploy": "npm run build && pm2 startOrRestart pm2.json",
@ -54,8 +55,8 @@
"devDependencies": {
"chimp": "^0.47.1",
"eslint": "^3.14.1",
"stylelint": "^7.7.1",
"supertest": "^2.0.1"
"stylelint": "^7.8.0",
"supertest": "^3.0.0"
},
"dependencies": {
"babel-runtime": "^6.22.0",

@ -23,6 +23,5 @@ Npm.depends({
'xmldom': '0.1.19',
'connect': '2.7.10',
'xmlbuilder': '2.6.4',
'querystring': '0.2.0',
'xml-encryption': '0.7.2'
'querystring': '0.2.0'
});

@ -7,9 +7,6 @@ var crypto = Npm.require('crypto');
var xmldom = Npm.require('xmldom');
var querystring = Npm.require('querystring');
var xmlbuilder = Npm.require('xmlbuilder');
// var xmlenc = Npm.require('xml-encryption');
// var xpath = xmlCrypto.xpath;
// var Dom = xmldom.DOMParser;
// var prefixMatch = new RegExp(/(?!xmlns)^.*:/);

@ -31,8 +31,9 @@ Package.onUse(function(api) {
api.addFiles('server/v1/im.js', 'server');
api.addFiles('server/v1/integrations.js', 'server');
api.addFiles('server/v1/misc.js', 'server');
api.addFiles('server/v1/users.js', 'server');
api.addFiles('server/v1/settings.js', 'server');
api.addFiles('server/v1/stats.js', 'server');
api.addFiles('server/v1/users.js', 'server');
});
Npm.depends({

@ -10,6 +10,24 @@ class API extends Restivus {
$loki: 0,
meta: 0
};
this._config.defaultOptionsEndpoint = function() {
if (this.request.method === 'OPTIONS' && this.request.headers['access-control-request-method']) {
if (RocketChat.settings.get('API_Enable_CORS') === true) {
this.response.writeHead(200, {
'Access-Control-Allow-Origin': RocketChat.settings.get('API_CORS_Origin'),
'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept, X-User-Id, X-Auth-Token'
});
} else {
this.response.writeHead(405);
this.response.write('CORS not enabled. Go to "Admin > General > REST Api" to enable it.');
}
} else {
this.response.writeHead(404);
}
this.done();
};
}
addAuthMethod(method) {

@ -4,5 +4,7 @@ RocketChat.settings.addGroup('General', function() {
this.add('API_Default_Count', 50, { type: 'int', public: false });
this.add('API_Allow_Infinite_Count', true, { type: 'boolean', public: false });
this.add('API_Enable_Direct_Message_History_EndPoint', false, { type: 'boolean', public: false });
this.add('API_Enable_CORS', false, { type: 'boolean', public: false });
this.add('API_CORS_Origin', '*', { type: 'string', public: false, enableQuery: { _id: 'API_Enable_CORS', value: true } });
});
});

@ -0,0 +1,44 @@
RocketChat.API.v1.addRoute('statistics', { authRequired: true }, {
get() {
let refresh = false;
if (typeof this.queryParams.refresh !== 'undefined' && this.queryParams.refresh === 'true') {
refresh = true;
}
let stats;
Meteor.runAsUser(this.userId, () => {
stats = Meteor.call('getStatistics', refresh);
});
return RocketChat.API.v1.success({
statistics: stats
});
}
});
RocketChat.API.v1.addRoute('statistics.list', { authRequired: true }, {
get() {
if (!RocketChat.authz.hasPermission(this.userId, 'view-statistics')) {
return RocketChat.API.v1.unauthorized();
}
const { offset, count } = this.getPaginationItems();
const { sort, fields, query } = this.parseJsonQuery();
const ourQuery = Object.assign({}, query);
const statistics = RocketChat.models.Statistics.find(ourQuery, {
sort: sort ? sort : { name: 1 },
skip: offset,
limit: count,
fields: Object.assign({}, fields, RocketChat.API.v1.defaultFieldsToExclude)
}).fetch();
return RocketChat.API.v1.success({
statistics,
count: statistics.length,
offset,
total: RocketChat.models.Statistics.find(ourQuery).count()
});
}
});

@ -7,7 +7,9 @@ Meteor.startup ->
permissions = [
{ _id: 'access-permissions', roles : ['admin'] }
{ _id: 'add-oauth-service', roles : ['admin'] }
{ _id: 'add-user-to-room', roles : ['admin', 'owner', 'moderator'] }
{ _id: 'add-user-to-joined-room', roles : ['admin', 'owner', 'moderator'] }
{ _id: 'add-user-to-any-c-room', roles : ['admin'] }
{ _id: 'add-user-to-any-p-room', roles : [] }
{ _id: 'archive-room', roles : ['admin', 'owner'] }
{ _id: 'assign-admin-role', roles : ['admin'] }
{ _id: 'ban-user', roles : ['admin', 'owner', 'moderator'] }

@ -44,25 +44,25 @@ class BotHelpers {
}
addUserToRoom(userName, room) {
let foundRoom = RocketChat.models.Rooms.findOneByIdOrName(room);
const foundRoom = RocketChat.models.Rooms.findOneByIdOrName(room);
if (!_.isObject(foundRoom)) {
throw new Meteor.Error('invalid-channel');
}
let data = {};
const data = {};
data.rid = foundRoom._id;
data.username = userName;
Meteor.call('addUserToRoom', data);
}
removeUserFromRoom(userName, room) {
let foundRoom = RocketChat.models.Rooms.findOneByIdOrName(room);
const foundRoom = RocketChat.models.Rooms.findOneByIdOrName(room);
if (!_.isObject(foundRoom)) {
throw new Meteor.Error('invalid-channel');
}
let data = {};
const data = {};
data.rid = foundRoom._id;
data.username = userName;
Meteor.call('removeUserFromRoom', data);
@ -155,7 +155,7 @@ RocketChat.settings.get('BotHelpers_userFields', function(settingKey, settingVal
Meteor.methods({
botRequest: (...args) => {
let userID = Meteor.userId();
const userID = Meteor.userId();
if (userID && RocketChat.authz.hasRole(userID, 'bot')) {
return botHelpers.request(...args);
} else {

@ -1,13 +1,13 @@
Meteor.startup(function() {
let roomSettingsChangedCallback = (msg) => {
const roomSettingsChangedCallback = (msg) => {
Tracker.nonreactive(() => {
if (msg.t === 'room_changed_privacy') {
if (Session.get('openedRoom') === msg.rid) {
let type = FlowRouter.current().route.name === 'channel' ? 'c' : 'p';
const type = FlowRouter.current().route.name === 'channel' ? 'c' : 'p';
RoomManager.close(type + FlowRouter.getParam('name'));
const subscription = ChatSubscription.findOne({ rid: msg.rid });
let route = subscription.t === 'c' ? 'channel' : 'group';
const route = subscription.t === 'c' ? 'channel' : 'group';
FlowRouter.go(route, { name: subscription.name }, FlowRouter.current().queryParams);
}
}
@ -18,11 +18,11 @@ Meteor.startup(function() {
RocketChat.callbacks.add('streamMessage', roomSettingsChangedCallback, RocketChat.callbacks.priority.HIGH, 'room-settings-changed');
let roomNameChangedCallback = (msg) => {
const roomNameChangedCallback = (msg) => {
Tracker.nonreactive(() => {
if (msg.t === 'r') {
if (Session.get('openedRoom') === msg.rid) {
let type = FlowRouter.current().route.name === 'channel' ? 'c' : 'p';
const type = FlowRouter.current().route.name === 'channel' ? 'c' : 'p';
RoomManager.close(type + FlowRouter.getParam('name'));
FlowRouter.go(FlowRouter.current().route.name, { name: msg.msg }, FlowRouter.current().queryParams);
}

@ -29,7 +29,7 @@ const CROWD = class CROWD {
const AtlassianCrowd = Npm.require('atlassian-crowd');
let url = RocketChat.settings.get('CROWD_URL');
let urlLastChar = url.slice(-1);
const urlLastChar = url.slice(-1);
if (urlLastChar !== '/') {
url += '/';
@ -236,7 +236,7 @@ Meteor.methods({
throw new Meteor.Error('crowd_disabled');
}
let crowd = new CROWD();
const crowd = new CROWD();
try {
crowd.checkConnection();

@ -33,7 +33,7 @@ Template.adminEmoji.helpers({
});
Template.adminEmoji.onCreated(function() {
let instance = this;
const instance = this;
this.limit = new ReactiveVar(50);
this.filter = new ReactiveVar('');
this.ready = new ReactiveVar(false);
@ -61,22 +61,22 @@ Template.adminEmoji.onCreated(function() {
});
this.autorun(function() {
let limit = (isSetNotNull(() => instance.limit))? instance.limit.get() : 0;
let subscription = instance.subscribe('fullEmojiData', '', limit);
const limit = (isSetNotNull(() => instance.limit))? instance.limit.get() : 0;
const subscription = instance.subscribe('fullEmojiData', '', limit);
instance.ready.set(subscription.ready());
});
this.customemoji = function() {
let filter = (isSetNotNull(() => instance.filter))? _.trim(instance.filter.get()) : '';
const filter = (isSetNotNull(() => instance.filter))? _.trim(instance.filter.get()) : '';
let query = {};
if (filter) {
let filterReg = new RegExp(s.escapeRegExp(filter), 'i');
const filterReg = new RegExp(s.escapeRegExp(filter), 'i');
query = { $or: [ { name: filterReg }, {aliases: filterReg } ] };
}
let limit = (isSetNotNull(() => instance.limit))? instance.limit.get() : 0;
const limit = (isSetNotNull(() => instance.limit))? instance.limit.get() : 0;
return RocketChat.models.EmojiCustom.find(query, { limit: limit, sort: { name: 1 }}).fetch();
};

@ -25,7 +25,7 @@ Template.emojiEdit.events({
},
['change input[type=file]'](ev) {
let e = (isSetNotNull(() => ev.originalEvent)) ? ev.originalEvent : ev;
const e = (isSetNotNull(() => ev.originalEvent)) ? ev.originalEvent : ev;
let files = e.target.files;
if (!isSetNotNull(() => e.target.files) || files.length === 0) {
if (isSetNotNull(() => e.dataTransfer.files)) {
@ -36,7 +36,7 @@ Template.emojiEdit.events({
}
//using let x of y here seems to have incompatibility with some phones
for (let file in files) {
for (const file in files) {
if (files.hasOwnProperty(file)) {
Template.instance().emojiFile = files[file];
}
@ -62,7 +62,7 @@ Template.emojiEdit.onCreated(function() {
};
this.getEmojiData = () => {
let emojiData = {};
const emojiData = {};
if (isSetNotNull(() => this.emoji)) {
emojiData._id = this.emoji._id;
emojiData.previousName = this.emoji.name;
@ -76,9 +76,9 @@ Template.emojiEdit.onCreated(function() {
};
this.validate = () => {
let emojiData = this.getEmojiData();
const emojiData = this.getEmojiData();
let errors = [];
const errors = [];
if (!emojiData.name) {
errors.push('Name');
}
@ -89,7 +89,7 @@ Template.emojiEdit.onCreated(function() {
}
}
for (let error of errors) {
for (const error of errors) {
toastr.error(TAPi18n.__('error-the-field-is-required', { field: TAPi18n.__(error) }));
}
@ -105,7 +105,7 @@ Template.emojiEdit.onCreated(function() {
this.save = (form) => {
if (this.validate()) {
let emojiData = this.getEmojiData();
const emojiData = this.getEmojiData();
if (this.emojiFile) {
emojiData.newFile = true;
@ -117,7 +117,7 @@ Template.emojiEdit.onCreated(function() {
if (this.emojiFile) {
toastr.info(TAPi18n.__('Uploading_file'));
let reader = new FileReader();
const reader = new FileReader();
reader.readAsBinaryString(this.emojiFile);
reader.onloadend = () => {
Meteor.call('uploadEmojiCustom', reader.result, this.emojiFile.type, emojiData, (uploadError/*, data*/) => {

@ -1,12 +1,12 @@
/* globals isSetNotNull */
Template.emojiInfo.helpers({
name() {
let emoji = Template.instance().emoji.get();
const emoji = Template.instance().emoji.get();
return emoji.name;
},
aliases() {
let emoji = Template.instance().emoji.get();
const emoji = Template.instance().emoji.get();
return emoji.aliases;
},
@ -19,7 +19,7 @@ Template.emojiInfo.helpers({
},
emojiToEdit() {
let instance = Template.instance();
const instance = Template.instance();
return {
tabBar: this.tabBar,
emoji: instance.emoji.get(),
@ -27,7 +27,7 @@ Template.emojiInfo.helpers({
instance.editingEmoji.set();
if (isSetNotNull(() => name)) {
let emoji = instance.emoji.get();
const emoji = instance.emoji.get();
if (isSetNotNull(() => emoji.name) && emoji.name !== name) {
return instance.loadedName.set(name);
}
@ -45,9 +45,9 @@ Template.emojiInfo.events({
['click .delete'](e, instance) {
e.stopPropagation();
e.preventDefault();
let emoji = instance.emoji.get();
const emoji = instance.emoji.get();
if (isSetNotNull(() => emoji)) {
let _id = emoji._id;
const _id = emoji._id;
swal({
title: t('Are_you_sure'),
text: t('Custom_Emoji_Delete_Warning'),
@ -99,15 +99,15 @@ Template.emojiInfo.onCreated(function() {
this.tabBar = Template.currentData().tabBar;
this.autorun(() => {
let data = Template.currentData();
const data = Template.currentData();
if (isSetNotNull(() => data.clear)) {
this.clear = data.clear;
}
});
this.autorun(() => {
let data = Template.currentData();
let emoji = this.emoji.get();
const data = Template.currentData();
const emoji = this.emoji.get();
if (isSetNotNull(() => emoji.name)) {
this.loadedName.set(emoji.name);
} else if (isSetNotNull(() => data.name)) {
@ -116,7 +116,7 @@ Template.emojiInfo.onCreated(function() {
});
this.autorun(() => {
let data = Template.currentData();
const data = Template.currentData();
this.emoji.set(data);
});
});

@ -5,7 +5,7 @@ RocketChat.emoji.packages.emojiCustom = {
list: [],
render: function(html) {
let regShortNames = new RegExp('<object[^>]*>.*?<\/object>|<span[^>]*>.*?<\/span>|<(?:object|embed|svg|img|div|span|p|a)[^>]*>|(' + RocketChat.emoji.packages.emojiCustom.list.join('|') + ')', 'gi');
const regShortNames = new RegExp('<object[^>]*>.*?<\/object>|<span[^>]*>.*?<\/span>|<(?:object|embed|svg|img|div|span|p|a)[^>]*>|(' + RocketChat.emoji.packages.emojiCustom.list.join('|') + ')', 'gi');
// replace regular shortnames first
html = html.replace(regShortNames, function(shortname) {
@ -33,7 +33,7 @@ RocketChat.emoji.packages.emojiCustom = {
getEmojiUrlFromName = function(name, extension) {
Session.get;
let key = `emoji_random_${name}`;
const key = `emoji_random_${name}`;
let random = 0;
if (isSetNotNull(() => Session.keys[key])) {
@ -43,7 +43,7 @@ getEmojiUrlFromName = function(name, extension) {
if (name == null) {
return;
}
let path = (Meteor.isCordova) ? Meteor.absoluteUrl().replace(/\/$/, '') : __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || '';
const path = (Meteor.isCordova) ? Meteor.absoluteUrl().replace(/\/$/, '') : __meteor_runtime_config__.ROOT_URL_PATH_PREFIX || '';
return `${path}/emoji-custom/${encodeURIComponent(name)}.${extension}?_dc=${random}`;
};
@ -51,8 +51,8 @@ Blaze.registerHelper('emojiUrlFromName', getEmojiUrlFromName);
function updateEmojiPickerList() {
let html = '';
for (let entry of RocketChat.emoji.packages.emojiCustom.emojisByCategory.rocket) {
let renderedEmoji = RocketChat.emoji.packages.emojiCustom.render(`:${entry}:`);
for (const entry of RocketChat.emoji.packages.emojiCustom.emojisByCategory.rocket) {
const renderedEmoji = RocketChat.emoji.packages.emojiCustom.render(`:${entry}:`);
html += `<li class="emoji-${entry}" data-emoji="${entry}">${renderedEmoji}</li>`;
}
$('.rocket.emoji-list').empty().append(html);
@ -61,18 +61,18 @@ function updateEmojiPickerList() {
deleteEmojiCustom = function(emojiData) {
delete RocketChat.emoji.list[`:${emojiData.name}:`];
let arrayIndex = RocketChat.emoji.packages.emojiCustom.emojisByCategory.rocket.indexOf(emojiData.name);
const arrayIndex = RocketChat.emoji.packages.emojiCustom.emojisByCategory.rocket.indexOf(emojiData.name);
if (arrayIndex !== -1) {
RocketChat.emoji.packages.emojiCustom.emojisByCategory.rocket.splice(arrayIndex, 1);
}
let arrayIndexList = RocketChat.emoji.packages.emojiCustom.list.indexOf(`:${emojiData.name}:`);
const arrayIndexList = RocketChat.emoji.packages.emojiCustom.list.indexOf(`:${emojiData.name}:`);
if (arrayIndexList !== -1) {
RocketChat.emoji.packages.emojiCustom.list.splice(arrayIndexList, 1);
}
if (isSetNotNull(() => emojiData.aliases)) {
for (let alias of emojiData.aliases) {
for (const alias of emojiData.aliases) {
delete RocketChat.emoji.list[`:${alias}:`];
let aliasIndex = RocketChat.emoji.packages.emojiCustom.list.indexOf(`:${alias}:`);
const aliasIndex = RocketChat.emoji.packages.emojiCustom.list.indexOf(`:${alias}:`);
if (aliasIndex !== -1) {
RocketChat.emoji.packages.emojiCustom.list.splice(aliasIndex, 1);
}
@ -85,13 +85,13 @@ updateEmojiCustom = function(emojiData) {
let key = `emoji_random_${emojiData.name}`;
Session.set(key, Math.round(Math.random() * 1000));
let previousExists = isSetNotNull(() => emojiData.previousName);
let currentAliases = isSetNotNull(() => emojiData.aliases);
const previousExists = isSetNotNull(() => emojiData.previousName);
const currentAliases = isSetNotNull(() => emojiData.aliases);
if (previousExists && isSetNotNull(() => RocketChat.emoji.list[`:${emojiData.previousName}:`].aliases)) {
for (let alias of RocketChat.emoji.list[`:${emojiData.previousName}:`].aliases) {
for (const alias of RocketChat.emoji.list[`:${emojiData.previousName}:`].aliases) {
delete RocketChat.emoji.list[`:${alias}:`];
let aliasIndex = RocketChat.emoji.packages.emojiCustom.list.indexOf(`:${alias}:`);
const aliasIndex = RocketChat.emoji.packages.emojiCustom.list.indexOf(`:${alias}:`);
if (aliasIndex !== -1) {
RocketChat.emoji.packages.emojiCustom.list.splice(aliasIndex, 1);
}
@ -99,25 +99,25 @@ updateEmojiCustom = function(emojiData) {
}
if (previousExists && emojiData.name !== emojiData.previousName) {
let arrayIndex = RocketChat.emoji.packages.emojiCustom.emojisByCategory.rocket.indexOf(emojiData.previousName);
const arrayIndex = RocketChat.emoji.packages.emojiCustom.emojisByCategory.rocket.indexOf(emojiData.previousName);
if (arrayIndex !== -1) {
RocketChat.emoji.packages.emojiCustom.emojisByCategory.rocket.splice(arrayIndex, 1);
}
let arrayIndexList = RocketChat.emoji.packages.emojiCustom.list.indexOf(`:${emojiData.previousName}:`);
const arrayIndexList = RocketChat.emoji.packages.emojiCustom.list.indexOf(`:${emojiData.previousName}:`);
if (arrayIndexList !== -1) {
RocketChat.emoji.packages.emojiCustom.list.splice(arrayIndexList, 1);
}
delete RocketChat.emoji.list[`:${emojiData.previousName}:`];
}
let categoryIndex = RocketChat.emoji.packages.emojiCustom.emojisByCategory.rocket.indexOf(`${emojiData.name}`);
const categoryIndex = RocketChat.emoji.packages.emojiCustom.emojisByCategory.rocket.indexOf(`${emojiData.name}`);
if (categoryIndex === -1) {
RocketChat.emoji.packages.emojiCustom.emojisByCategory.rocket.push(`${emojiData.name}`);
RocketChat.emoji.packages.emojiCustom.list.push(`:${emojiData.name}:`);
}
RocketChat.emoji.list[`:${emojiData.name}:`] = Object.assign({ emojiPackage: 'emojiCustom' }, RocketChat.emoji.list[`:${emojiData.name}:`], emojiData);
if (currentAliases) {
for (let alias of emojiData.aliases) {
for (const alias of emojiData.aliases) {
RocketChat.emoji.packages.emojiCustom.list.push(`:${alias}:`);
RocketChat.emoji.list[`:${alias}:`] = {};
RocketChat.emoji.list[`:${alias}:`].emojiPackage = 'emojiCustom';
@ -125,7 +125,7 @@ updateEmojiCustom = function(emojiData) {
}
}
let url = getEmojiUrlFromName(emojiData.name, emojiData.extension);
const url = getEmojiUrlFromName(emojiData.name, emojiData.extension);
//update in admin interface
if (previousExists && emojiData.name !== emojiData.previousName) {
@ -145,7 +145,7 @@ updateEmojiCustom = function(emojiData) {
//update in picker and opened rooms
for (key in RoomManager.openedRooms) {
if (RoomManager.openedRooms.hasOwnProperty(key)) {
let room = RoomManager.openedRooms[key];
const room = RoomManager.openedRooms[key];
if (previousExists && emojiData.name !== emojiData.previousName) {
$(room.dom).find(`span[data-emoji='${emojiData.previousName}']`).css('background-image', `url('${url}')`).attr('data-emoji', `${emojiData.name}`);
} else {
@ -160,12 +160,12 @@ updateEmojiCustom = function(emojiData) {
Meteor.startup(() =>
Meteor.call('listEmojiCustom', (error, result) => {
RocketChat.emoji.packages.emojiCustom.emojisByCategory = { rocket: [] };
for (let emoji of result) {
for (const emoji of result) {
RocketChat.emoji.packages.emojiCustom.emojisByCategory.rocket.push(emoji.name);
RocketChat.emoji.packages.emojiCustom.list.push(`:${emoji.name}:`);
RocketChat.emoji.list[`:${emoji.name}:`] = emoji;
RocketChat.emoji.list[`:${emoji.name}:`].emojiPackage = 'emojiCustom';
for (let alias of emoji['aliases']) {
for (const alias of emoji['aliases']) {
RocketChat.emoji.packages.emojiCustom.list.push(`:${alias}:`);
RocketChat.emoji.list[`:${alias}:`] = {
emojiPackage: 'emojiCustom',

@ -14,8 +14,8 @@ Meteor.methods({
//allow all characters except colon, whitespace, comma, >, <, &, ", ', /, \, (, )
//more practical than allowing specific sets of characters; also allows foreign languages
let nameValidation = /[\s,:><&"'\/\\\(\)]/;
let aliasValidation = /[:><&"'\/\\\(\)]/;
const nameValidation = /[\s,:><&"'\/\\\(\)]/;
const aliasValidation = /[:><&"'\/\\\(\)]/;
//silently strip colon; this allows for uploading :emojiname: as emojiname
emojiData.name = emojiData.name.replace(/:/g, '');
@ -40,12 +40,12 @@ Meteor.methods({
if (emojiData._id) {
matchingResults = RocketChat.models.EmojiCustom.findByNameOrAliasExceptID(emojiData.name, emojiData._id).fetch();
for (let alias of emojiData.aliases) {
for (const alias of emojiData.aliases) {
matchingResults = matchingResults.concat(RocketChat.models.EmojiCustom.findByNameOrAliasExceptID(alias, emojiData._id).fetch());
}
} else {
matchingResults = RocketChat.models.EmojiCustom.findByNameOrAlias(emojiData.name).fetch();
for (let alias of emojiData.aliases) {
for (const alias of emojiData.aliases) {
matchingResults = matchingResults.concat(RocketChat.models.EmojiCustom.findByNameOrAlias(alias).fetch());
}
}
@ -56,13 +56,13 @@ Meteor.methods({
if (!emojiData._id) {
//insert emoji
let createEmoji = {
const createEmoji = {
name: emojiData.name,
aliases: emojiData.aliases,
extension: emojiData.extension
};
let _id = RocketChat.models.EmojiCustom.create(createEmoji);
const _id = RocketChat.models.EmojiCustom.create(createEmoji);
RocketChat.Notifications.notifyLogged('updateEmojiCustom', {emojiData: createEmoji});
@ -77,10 +77,10 @@ Meteor.methods({
RocketChat.models.EmojiCustom.setExtension(emojiData._id, emojiData.extension);
} else if (emojiData.name !== emojiData.previousName) {
let rs = RocketChatFileEmojiCustomInstance.getFileWithReadStream(encodeURIComponent(`${emojiData.previousName}.${emojiData.previousExtension}`));
const rs = RocketChatFileEmojiCustomInstance.getFileWithReadStream(encodeURIComponent(`${emojiData.previousName}.${emojiData.previousExtension}`));
if (rs !== null) {
RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.name}.${emojiData.extension}`));
let ws = RocketChatFileEmojiCustomInstance.createWriteStream(encodeURIComponent(`${emojiData.name}.${emojiData.previousExtension}`), rs.contentType);
const ws = RocketChatFileEmojiCustomInstance.createWriteStream(encodeURIComponent(`${emojiData.name}.${emojiData.previousExtension}`), rs.contentType);
ws.on('end', Meteor.bindEnvironment(() =>
RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.previousName}.${emojiData.previousExtension}`))
));

@ -7,11 +7,11 @@ Meteor.methods({
//delete aliases for notification purposes. here, it is a string rather than an array
delete emojiData.aliases;
let file = new Buffer(binaryContent, 'binary');
const file = new Buffer(binaryContent, 'binary');
let rs = RocketChatFile.bufferToStream(file);
const rs = RocketChatFile.bufferToStream(file);
RocketChatFileEmojiCustomInstance.deleteFile(encodeURIComponent(`${emojiData.name}.${emojiData.extension}`));
let ws = RocketChatFileEmojiCustomInstance.createWriteStream(encodeURIComponent(`${emojiData.name}.${emojiData.extension}`), contentType);
const ws = RocketChatFileEmojiCustomInstance.createWriteStream(encodeURIComponent(`${emojiData.name}.${emojiData.extension}`), contentType);
ws.on('end', Meteor.bindEnvironment(() =>
Meteor.setTimeout(() => RocketChat.Notifications.notifyLogged('updateEmojiCustom', {emojiData})
, 500)

@ -14,7 +14,7 @@ class EmojiCustom extends RocketChat.models._Base {
//find
findByNameOrAlias(name, options) {
let query = {
const query = {
$or: [
{name},
{aliases: name}
@ -25,7 +25,7 @@ class EmojiCustom extends RocketChat.models._Base {
}
findByNameOrAliasExceptID(name, except, options) {
let query = {
const query = {
_id: { $nin: [ except ] },
$or: [
{name},
@ -39,7 +39,7 @@ class EmojiCustom extends RocketChat.models._Base {
//update
setName(_id, name) {
let update = {
const update = {
$set: {
name
}
@ -49,7 +49,7 @@ class EmojiCustom extends RocketChat.models._Base {
}
setAliases(_id, aliases) {
let update = {
const update = {
$set: {
aliases
}
@ -59,7 +59,7 @@ class EmojiCustom extends RocketChat.models._Base {
}
setExtension(_id, extension) {
let update = {
const update = {
$set: {
extension
}

@ -3,7 +3,7 @@ Meteor.publish('fullEmojiData', function(filter, limit) {
return this.ready();
}
let fields = {
const fields = {
name: 1,
aliases: 1,
extension: 1
@ -11,14 +11,14 @@ Meteor.publish('fullEmojiData', function(filter, limit) {
filter = s.trim(filter);
let options = {
const options = {
fields,
limit,
sort: { name: 1 }
};
if (filter) {
let filterReg = new RegExp(s.escapeRegExp(filter), 'i');
const filterReg = new RegExp(s.escapeRegExp(filter), 'i');
return RocketChat.models.EmojiCustom.findByNameOrAlias(filterReg, options);
}

@ -6,7 +6,7 @@ Meteor.startup(function() {
storeType = RocketChat.settings.get('EmojiUpload_Storage_Type');
}
let RocketChatStore = RocketChatFile[storeType];
const RocketChatStore = RocketChatFile[storeType];
if (!isSetNotNull(() => RocketChatStore)) {
throw new Error(`Invalid RocketChatStore type [${storeType}]`);
@ -27,7 +27,7 @@ Meteor.startup(function() {
});
return WebApp.connectHandlers.use('/emoji-custom/', Meteor.bindEnvironment(function(req, res/*, next*/) {
let params =
const params =
{emoji: decodeURIComponent(req.url.replace(/^\//, '').replace(/\?.*$/, ''))};
if (_.isEmpty(params.emoji)) {
@ -37,7 +37,7 @@ Meteor.startup(function() {
return;
}
let file = RocketChatFileEmojiCustomInstance.getFileWithReadStream(encodeURIComponent(params.emoji));
const file = RocketChatFileEmojiCustomInstance.getFileWithReadStream(encodeURIComponent(params.emoji));
res.setHeader('Content-Disposition', 'inline');
@ -48,7 +48,7 @@ Meteor.startup(function() {
res.setHeader('Expires', '-1');
res.setHeader('Last-Modified', 'Thu, 01 Jan 2015 00:00:00 GMT');
let reqModifiedHeader = req.headers['if-modified-since'];
const reqModifiedHeader = req.headers['if-modified-since'];
if (reqModifiedHeader != null) {
if (reqModifiedHeader === 'Thu, 01 Jan 2015 00:00:00 GMT') {
res.writeHead(304);
@ -57,10 +57,10 @@ Meteor.startup(function() {
}
}
let color = '#000';
let initials = '?';
const color = '#000';
const initials = '?';
let svg = `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
const svg = `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" pointer-events="none" width="50" height="50" style="width: 50px; height: 50px; background-color: ${color};">
<text text-anchor="middle" y="50%" x="50%" dy="0.36em" pointer-events="auto" fill="#ffffff" font-family="Helvetica, Arial, Lucida Grande, sans-serif" style="font-weight: 400; font-size: 28px;">
${initials}
@ -77,7 +77,7 @@ Meteor.startup(function() {
fileUploadDate = file.uploadDate.toUTCString();
}
let reqModifiedHeader = req.headers['if-modified-since'];
const reqModifiedHeader = req.headers['if-modified-since'];
if (isSetNotNull(() => reqModifiedHeader)) {
if (reqModifiedHeader === fileUploadDate) {
res.setHeader('Last-Modified', reqModifiedHeader);

@ -23,9 +23,9 @@ function isSetNotNull(fn) {
}
// RocketChat.emoji.list is the collection of emojis from all emoji packages
for (let key in emojione.emojioneList) {
for (const key in emojione.emojioneList) {
if (emojione.emojioneList.hasOwnProperty(key)) {
let emoji = emojione.emojioneList[key];
const emoji = emojione.emojioneList[key];
emoji.emojiPackage = 'emojione';
RocketChat.emoji.list[key] = emoji;
}

@ -8,7 +8,7 @@ Template.messageBox.events({
RocketChat.EmojiPicker.open(event.currentTarget, (emoji) => {
const input = $(event.currentTarget).parent().parent().find('.input-message');
let emojiValue = ':' + emoji + ':';
const emojiValue = ':' + emoji + ':';
var caretPos = input.prop('selectionStart');
var textAreaTxt = input.val();

@ -16,11 +16,11 @@ RocketChat.callbacks.add('renderMessage', (message) => {
message.html = RocketChat.emoji.packages[emojiPackage].render(message.html);
});
let checkEmojiOnly = $(`<div>${message.html}</div>`);
const checkEmojiOnly = $(`<div>${message.html}</div>`);
let emojiOnly = true;
for (let childNode in checkEmojiOnly[0].childNodes) {
for (const childNode in checkEmojiOnly[0].childNodes) {
if (checkEmojiOnly[0].childNodes.hasOwnProperty(childNode)) {
let child = $(checkEmojiOnly[0].childNodes[childNode]);
const child = $(checkEmojiOnly[0].childNodes[childNode]);
if (child.hasClass('emoji') || child.hasClass('emojione')) {
checkEmojiOnly[0].childNodes[childNode] = child.addClass('big');

@ -6,7 +6,7 @@ var emojiCategories = {};
* @return {string} readable and translated
*/
function categoryName(category) {
for (let emojiPackage in RocketChat.emoji.packages) {
for (const emojiPackage in RocketChat.emoji.packages) {
if (RocketChat.emoji.packages.hasOwnProperty(emojiPackage)) {
if (RocketChat.emoji.packages[emojiPackage].emojiCategories.hasOwnProperty(category)) {
return RocketChat.emoji.packages[emojiPackage].emojiCategories[category];
@ -24,12 +24,12 @@ function getEmojisByCategory(category) {
const t = Template.instance();
const actualTone = t.tone;
let html = '';
for (let emojiPackage in RocketChat.emoji.packages) {
for (const emojiPackage in RocketChat.emoji.packages) {
if (RocketChat.emoji.packages.hasOwnProperty(emojiPackage)) {
if (RocketChat.emoji.packages[emojiPackage].emojisByCategory.hasOwnProperty(category)) {
let total = RocketChat.emoji.packages[emojiPackage].emojisByCategory[category].length;
const total = RocketChat.emoji.packages[emojiPackage].emojisByCategory[category].length;
for (let i = 0; i < total; i++) {
let emoji = RocketChat.emoji.packages[emojiPackage].emojisByCategory[category][i];
const emoji = RocketChat.emoji.packages[emojiPackage].emojisByCategory[category][i];
let tone = '';
if (actualTone > 0 && RocketChat.emoji.packages[emojiPackage].toneList.hasOwnProperty(emoji)) {
@ -38,7 +38,7 @@ function getEmojisByCategory(category) {
//set correctPackage here to allow for recent emojis to work properly
if (isSetNotNull(() => RocketChat.emoji.list[`:${emoji}:`].emojiPackage)) {
let correctPackage = RocketChat.emoji.list[`:${emoji}:`].emojiPackage;
const correctPackage = RocketChat.emoji.list[`:${emoji}:`].emojiPackage;
const image = RocketChat.emoji.packages[correctPackage].render(`:${emoji}${tone}:`);
@ -56,7 +56,7 @@ function getEmojisBySearchTerm(searchTerm) {
const t = Template.instance();
const actualTone = t.tone;
let searchRegExp = new RegExp(RegExp.escape(searchTerm.replace(/:/g, '')), 'i');
const searchRegExp = new RegExp(RegExp.escape(searchTerm.replace(/:/g, '')), 'i');
for (let emoji in RocketChat.emoji.list) {
if (!RocketChat.emoji.list.hasOwnProperty(emoji)) {
@ -64,8 +64,8 @@ function getEmojisBySearchTerm(searchTerm) {
}
if (searchRegExp.test(emoji)) {
let emojiObject = RocketChat.emoji.list[emoji];
let emojiPackage = emojiObject.emojiPackage;
const emojiObject = RocketChat.emoji.list[emoji];
const emojiPackage = emojiObject.emojiPackage;
let tone = '';
emoji = emoji.replace(/:/g, '');
@ -75,9 +75,9 @@ function getEmojisBySearchTerm(searchTerm) {
let emojiFound = false;
for (let key in RocketChat.emoji.packages[emojiPackage].emojisByCategory) {
for (const key in RocketChat.emoji.packages[emojiPackage].emojisByCategory) {
if (RocketChat.emoji.packages[emojiPackage].emojisByCategory.hasOwnProperty(key)) {
let contents = RocketChat.emoji.packages[emojiPackage].emojisByCategory[key];
const contents = RocketChat.emoji.packages[emojiPackage].emojisByCategory[key];
if (contents.indexOf(emoji) !== -1) {
emojiFound = true;
break;
@ -86,7 +86,7 @@ function getEmojisBySearchTerm(searchTerm) {
}
if (emojiFound) {
let image = RocketChat.emoji.packages[emojiPackage].render(`:${emoji}${tone}:`);
const image = RocketChat.emoji.packages[emojiPackage].render(`:${emoji}${tone}:`);
html += `<li class="emoji-${emoji}" data-emoji="${emoji}" title="${emoji}">${image}</li>`;
}
}
@ -97,10 +97,10 @@ function getEmojisBySearchTerm(searchTerm) {
Template.emojiPicker.helpers({
category() {
let categories = [];
for (let emojiPackage in RocketChat.emoji.packages) {
const categories = [];
for (const emojiPackage in RocketChat.emoji.packages) {
if (RocketChat.emoji.packages.hasOwnProperty(emojiPackage)) {
for (let key in RocketChat.emoji.packages[emojiPackage].emojisByCategory) {
for (const key in RocketChat.emoji.packages[emojiPackage].emojisByCategory) {
if (RocketChat.emoji.packages[emojiPackage].emojisByCategory.hasOwnProperty(key)) {
categories.push(key);
}
@ -111,7 +111,7 @@ Template.emojiPicker.helpers({
},
emojiByCategory(category) {
let emojisByCategory = [];
for (let emojiPackage in RocketChat.emoji.packages) {
for (const emojiPackage in RocketChat.emoji.packages) {
if (RocketChat.emoji.packages.hasOwnProperty(emojiPackage)) {
if (RocketChat.emoji.packages[emojiPackage].emojisByCategory.hasOwnProperty(category)) {
emojisByCategory = emojisByCategory.concat(RocketChat.emoji.packages[emojiPackage].emojisByCategory[category]);
@ -195,7 +195,7 @@ Template.emojiPicker.events({
event.stopPropagation();
event.preventDefault();
let tone = parseInt(event.currentTarget.dataset.tone);
const tone = parseInt(event.currentTarget.dataset.tone);
let newTone;
if (tone > 0) {
@ -204,10 +204,10 @@ Template.emojiPicker.events({
newTone = '';
}
for (let emojiPackage in RocketChat.emoji.packages) {
for (const emojiPackage in RocketChat.emoji.packages) {
if (RocketChat.emoji.packages.hasOwnProperty(emojiPackage)) {
if (RocketChat.emoji.packages[emojiPackage].hasOwnProperty('toneList')) {
for (let emoji in RocketChat.emoji.packages[emojiPackage].toneList) {
for (const emoji in RocketChat.emoji.packages[emojiPackage].toneList) {
if (RocketChat.emoji.packages[emojiPackage].toneList.hasOwnProperty(emoji)) {
$('.emoji-'+emoji).html(RocketChat.emoji.packages[emojiPackage].render(':' + emoji + newTone + ':'));
}
@ -225,11 +225,11 @@ Template.emojiPicker.events({
'click .emoji-list li'(event, instance) {
event.stopPropagation();
let emoji = event.currentTarget.dataset.emoji;
let actualTone = instance.tone;
const emoji = event.currentTarget.dataset.emoji;
const actualTone = instance.tone;
let tone = '';
for (let emojiPackage in RocketChat.emoji.packages) {
for (const emojiPackage in RocketChat.emoji.packages) {
if (RocketChat.emoji.packages.hasOwnProperty(emojiPackage)) {
if (actualTone > 0 && RocketChat.emoji.packages[emojiPackage].toneList.hasOwnProperty(emoji)) {
tone = '_tone' + actualTone;
@ -262,7 +262,7 @@ Template.emojiPicker.events({
Template.emojiPicker.onCreated(function() {
this.tone = RocketChat.EmojiPicker.getTone();
let recent = RocketChat.EmojiPicker.getRecent();
const recent = RocketChat.EmojiPicker.getRecent();
this.currentCategory = new ReactiveVar(recent.length > 0 ? 'recent' : 'people');
this.currentSearchTerm = new ReactiveVar('');

@ -52,10 +52,10 @@ RocketChat.EmojiPicker = {
return this.recent;
},
setPosition() {
let sourcePos = $(this.source).offset();
let left = sourcePos.left;
let top = (sourcePos.top - this.height - 5);
let cssProperties = {
const sourcePos = $(this.source).offset();
const left = sourcePos.left;
const top = (sourcePos.top - this.height - 5);
const cssProperties = {
top: top,
left: left
};
@ -67,11 +67,11 @@ RocketChat.EmojiPicker = {
if (left < 35) {
cssProperties.left = 0;
} else {
let windowSize = $(window).width();
let pickerWidth = $('.emoji-picker').width();
const windowSize = $(window).width();
const pickerWidth = $('.emoji-picker').width();
if (left + pickerWidth > windowSize) {
let emojiButtonSize = $('.reaction-message.message-action').outerWidth();
const emojiButtonSize = $('.reaction-message.message-action').outerWidth();
cssProperties.left = left - pickerWidth + emojiButtonSize;
}
}
@ -105,7 +105,7 @@ RocketChat.EmojiPicker = {
this.addRecent(emoji);
},
addRecent(emoji) {
let pos = this.recent.indexOf(emoji);
const pos = this.recent.indexOf(emoji);
if (pos !== -1) {
this.recent.splice(pos, 1);
@ -119,14 +119,14 @@ RocketChat.EmojiPicker = {
this.updateRecent();
},
updateRecent() {
let total = RocketChat.emoji.packages.base.emojisByCategory.recent.length;
const total = RocketChat.emoji.packages.base.emojisByCategory.recent.length;
let html = '';
for (var i = 0; i < total; i++) {
let emoji = RocketChat.emoji.packages.base.emojisByCategory.recent[i];
const emoji = RocketChat.emoji.packages.base.emojisByCategory.recent[i];
if (isSetNotNull(() => RocketChat.emoji.list[`:${emoji}:`])) {
let emojiPackage = RocketChat.emoji.list[`:${emoji}:`].emojiPackage;
let renderedEmoji = RocketChat.emoji.packages[emojiPackage].render(`:${emoji}:`);
const emojiPackage = RocketChat.emoji.list[`:${emoji}:`].emojiPackage;
const renderedEmoji = RocketChat.emoji.packages[emojiPackage].render(`:${emoji}:`);
html += `<li class="emoji-${emoji}" data-emoji="${emoji}">${renderedEmoji}</li>`;
} else {
this.recent = _.without(this.recent, emoji);

@ -1,7 +1,7 @@
/* globals HTML, isSetNotNull, renderEmoji:true */
renderEmoji = function(emoji) {
if (isSetNotNull(() => RocketChat.emoji.list[emoji].emojiPackage)) {
let emojiPackage = RocketChat.emoji.list[emoji].emojiPackage;
const emojiPackage = RocketChat.emoji.list[emoji].emojiPackage;
return RocketChat.emoji.packages[emojiPackage].render(emoji);
}
};
@ -9,11 +9,11 @@ renderEmoji = function(emoji) {
Blaze.registerHelper('renderEmoji', renderEmoji);
Template.registerHelper('renderEmoji', new Template('renderEmoji', function() {
let view = this;
let emoji = Blaze.getData(view);
const view = this;
const emoji = Blaze.getData(view);
if (isSetNotNull(() => RocketChat.emoji.list[emoji].emojiPackage)) {
let emojiPackage = RocketChat.emoji.list[emoji].emojiPackage;
const emojiPackage = RocketChat.emoji.list[emoji].emojiPackage;
return new HTML.Raw(RocketChat.emoji.packages[emojiPackage].render(emoji));
}

@ -26,7 +26,7 @@ class ErrorHandler {
}));
const self = this;
let originalMeteorDebug = Meteor._debug;
const originalMeteorDebug = Meteor._debug;
Meteor._debug = function(message, stack) {
if (!self.reporting) {
return originalMeteorDebug.call(this, message, stack);
@ -38,7 +38,7 @@ class ErrorHandler {
getRoomId(roomName) {
roomName = roomName.replace('#');
let room = RocketChat.models.Rooms.findOneByName(roomName, { fields: { _id: 1, t: 1 } });
const room = RocketChat.models.Rooms.findOneByName(roomName, { fields: { _id: 1, t: 1 } });
if (room && (room.t === 'c' || room.t === 'p')) {
return room._id;
} else {
@ -49,7 +49,7 @@ class ErrorHandler {
trackError(message, stack) {
if (this.reporting && this.rid && this.lastError !== message) {
this.lastError = message;
let user = RocketChat.models.Users.findOneById('rocket.cat');
const user = RocketChat.models.Users.findOneById('rocket.cat');
if (stack) {
message = message + '\n```\n' + stack + '\n```';

@ -18,7 +18,7 @@ FileUpload.FileSystem = class FileUploadFileSystem extends FileUploadBase {
onError: (err) => {
var uploading = Session.get('uploading');
if (uploading != null) {
let item = _.findWhere(uploading, {
const item = _.findWhere(uploading, {
id: this.id
});
if (item != null) {
@ -37,7 +37,7 @@ FileUpload.FileSystem = class FileUploadFileSystem extends FileUploadBase {
Meteor.setTimeout(() => {
var uploading = Session.get('uploading');
if (uploading != null) {
let item = _.findWhere(uploading, {
const item = _.findWhere(uploading, {
id: this.id
});
return Session.set('uploading', _.without(uploading, item));

@ -9,7 +9,7 @@ FileUpload.GridFS = class FileUploadGridFS extends FileUploadBase {
onError: (err) => {
var uploading = Session.get('uploading');
if (uploading != null) {
let item = _.findWhere(uploading, {
const item = _.findWhere(uploading, {
id: this.id
});
if (item != null) {
@ -28,7 +28,7 @@ FileUpload.GridFS = class FileUploadGridFS extends FileUploadBase {
Meteor.setTimeout(() => {
var uploading = Session.get('uploading');
if (uploading != null) {
let item = _.findWhere(uploading, {
const item = _.findWhere(uploading, {
id: this.id
});
return Session.set('uploading', _.without(uploading, item));

@ -16,7 +16,7 @@ const generateURL = function(file) {
FileUpload.addHandler('s3', {
get(file, req, res) {
let fileUrl = generateURL(file);
const fileUrl = generateURL(file);
if (fileUrl) {
res.setHeader('Location', fileUrl);
@ -25,8 +25,8 @@ FileUpload.addHandler('s3', {
res.end();
},
delete(file) {
let s3 = new AWS.S3();
let request = s3.deleteObject({
const s3 = new AWS.S3();
const request = s3.deleteObject({
Bucket: file.s3.bucket,
Key: file.s3.path + file._id
});

@ -170,6 +170,8 @@
"API_EmbedIgnoredHosts_Description": "Čárkami oddělený seznam hostitelů nebo adres CIDR, např. localhost, 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16",
"API_EmbedSafePorts": "Bezpečné Porty",
"API_EmbedSafePorts_Description": "Čárkami oddělený seznam portů povolených pro zobrazení náhledu.",
"API_Enable_Direct_Message_History_EndPoint": "Povolit Endpoint přímých zpráv",
"API_Enable_Direct_Message_History_EndPoint_Description": "Povolí endpoint `/api/v1/im.history.others` přes který lze stahovat přímé zprávy mezi všemi uživateli.",
"API_GitHub_Enterprise_URL": "Adresa URL serveru",
"API_GitHub_Enterprise_URL_Description": "Příklad: http://domain.com (bez lomítka na konci)",
"API_Gitlab_URL": "GitLab URL",
@ -269,6 +271,7 @@
"channel": "místnost",
"Channel": "Místnost",
"Channel_already_exist": "Místnost '#%s' již existuje.",
"Channel_created": "Místnost `#%s` byla vytvořena.",
"Channel_already_Unarchived": "Místnost `#%s` je již v odarchivovaném stavu",
"Channel_Archived": "Místnost `#%s` byla úspěšně archivována",
"Channel_doesnt_exist": "Místnost `# %s` neexistuje.",
@ -291,6 +294,7 @@
"clear_cache_now": "Vyčistit cache",
"Clear_all_unreads_question": "Označit vše jako přečtené?",
"Click_here": "Klikněte zde",
"Click_here_for_more_info": "Klikněte pro více infomací",
"Client_ID": "ID klienta",
"Client_Secret": "Secret klienta",
"Clients_will_refresh_in_a_few_seconds": "Klienti se obnoví během několika sekund",
@ -351,8 +355,8 @@
"Delete": "Smazat",
"Delete_message": "Smazat zprávu",
"Delete_my_account": "Smazat můj účet",
"Delete_Room_Warning": "Odstranění místnosti smaže všechny zprávy poslané v rámci místnosti. Toto nelze vrátit zpět!",
"Delete_User_Warning": "Odstranění uživatele smaže také všechny zprávy od daného uživatele. Toto nelze vrátit zpět!",
"Delete_Room_Warning": "Odstranění místnosti smaže všechny zprávy poslané v rámci místnosti. Tuto akci nelze vzít zpět!",
"Delete_User_Warning": "Odstranění uživatele smaže také všechny jeho zprávy. Tuto akci nelze vzít zpět!",
"Deleted": "Smazáno!",
"Department": "Oddělení",
"Department_removed": "Oddělení odstraněno",
@ -420,6 +424,8 @@
"Enter_name_here": "Zadejte jméno",
"Enter_to": "Enter",
"Error": "Chyba",
"Error_RocketChat_requires_oplog_tailing_when_running_in_multiple_instances": "Chyba: Rocket.Chat vyžaduje tail oplogu pokud běží na více instancích.",
"Error_RocketChat_requires_oplog_tailing_when_running_in_multiple_instances_details": "Prověřte, že je MongoDB v ReplicaSet módu a proměnná prostředí MONGO_OPLOG_URL je na aplikačním serveru nastavena správně",
"error-action-not-allowed": "__action__ není povolena",
"error-application-not-found": "Aplikace nenalezena",
"error-archived-duplicate-name": "Existuje archivovaná místnost s názvem '__room_name__'",
@ -489,6 +495,7 @@
"error-user-is-not-activated": "Uživatel není aktivován",
"error-user-not-in-room": "Uživatel není v této místnosti",
"error-user-registration-disabled": "Registrace je zakázána",
"error-user-limit-exceeded": "Počet uživatelů, které chcete pozvat do #channel_name překračuje maximální počet nastavený administrátorem",
"error-user-registration-secret": "Registrace uživatele je povolena pouze přes tajnou URL",
"error-you-are-last-owner": "Jste poslední vlastníkem místnosti. Před opuštěním místnosti prosím nastavte nového vlastníka.",
"Error_changing_password": "Chyba změny hesla",
@ -655,6 +662,8 @@
"Invitation_Subject": "Předmět pozvánky",
"Invitation_Subject_Default": "Byli jste pozváni na [Site_Name]",
"Invite_user_to_join_channel": "Pozvat jednoho uživatele, aby se připojil k této místnosti",
"Invite_user_to_join_channel_all_to": "Pozvat všechny uživatele v této místnosti do [#channel]",
"Invite_user_to_join_channel_all_from": "Pozvat všechny uživatele v [#channel] do této místnosti",
"Invite_Users": "Pozvat uživatele",
"is_also_typing": "také píše",
"is_also_typing_female": "také píše",
@ -838,7 +847,7 @@
"MapView_GMapsAPIKey_Description": "Lze získat zdarma z Google Developers Console ",
"Mark_as_read": "Označit jako přečtené",
"Mark_as_unread": "Označit jako nepřečtené",
"Markdown_Headers": "Markdownu nadpisy",
"Markdown_Headers": "Povolit markdown v nadpisech",
"Markdown_SupportSchemesForLink": "Schémata používaná pro automatické odkazy markdown",
"Markdown_SupportSchemesForLink_Description": "Čárkami oddělený seznam povolených schémat",
"Max_length_is": "Maximální délka je %s",
@ -1383,6 +1392,7 @@
"Type_your_new_password": "Zadejte nové heslo",
"UI_DisplayRoles": "Zobrazit Role",
"UI_Merge_Channels_Groups": "Sloučit privátní skupiny s místnostmi",
"UI_Use_Name_Avatar": "Použít iniciály celého jména uživatele pro výchozí avatar",
"Unarchive": "Zrušit archivaci",
"Unblock_User": "Odblokovat uživatele",
"Unmute_someone_in_room": "Zrušit ztlumení někoho v místnosti",
@ -1460,6 +1470,7 @@
"Username_title": "Registrovat uživatelské jméno",
"Username_wants_to_start_otr_Do_you_want_to_accept": "__username__ chce spustit OTR (konverzaci mimo záznam). Chcete ji přijmout?",
"Users": "Uživatelé",
"Users_added": "Uživatelé byli přidáni",
"Users_in_role": "Uživatelé v roli",
"UTF8_Names_Slugify": "Url podoba UTF8 jmen",
"UTF8_Names_Validation": "UTF8 validace jmen",

@ -159,6 +159,7 @@
"API_Allow_Infinite_Count": "Allow Getting Everything",
"API_Allow_Infinite_Count_Description": "Should calls to the REST API be allowed to return everything in one call?",
"API_Analytics": "Analytics",
"API_CORS_Origin": "CORS Origin",
"API_Default_Count": "Default Count",
"API_Default_Count_Description": "The default count for REST API results if the consumer did not provided any.",
"API_Embed": "Embed Link Previews",
@ -170,6 +171,7 @@
"API_EmbedIgnoredHosts_Description": "Comma-separated list of hosts or CIDR addresses, eg. localhost, 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16",
"API_EmbedSafePorts": "Safe Ports",
"API_EmbedSafePorts_Description": "Comma-separated list of ports allowed for previewing.",
"API_Enable_CORS": "Enable CORS",
"API_Enable_Direct_Message_History_EndPoint": "Enable Direct Message History Endpoint",
"API_Enable_Direct_Message_History_EndPoint_Description": "This enables the `/api/v1/im.history.others` which allows the viewing of direct messages sent by other users that the caller is not part of.",
"API_GitHub_Enterprise_URL": "Server URL",
@ -504,7 +506,7 @@
"error-user-is-not-activated": "User is not activated",
"error-user-not-in-room": "User is not in this room",
"error-user-registration-disabled": "User registration is disabled",
"error-user-limit-exceeded" : "The number of users you are trying to invite to #channel_name exceeds the limit set by the administrator",
"error-user-limit-exceeded": "The number of users you are trying to invite to #channel_name exceeds the limit set by the administrator",
"error-user-registration-secret": "User registration is only allowed via Secret URL",
"error-you-are-last-owner": "You are the last owner. Please set new owner before leaving the room.",
"Error_changing_password": "Error changing password",
@ -673,7 +675,7 @@
"Invitation_Subject_Default": "You have been invited to [Site_Name]",
"Invite_user_to_join_channel": "Invite one user to join this channel",
"Invite_user_to_join_channel_all_to": "Invite all users from this channel to join [#channel]",
"Invite_user_to_join_channel_all_from": "Invite all users from [#channel] to join this channel",
"Invite_user_to_join_channel_all_from": "Invite all users from [#channel] to join this channel",
"Invite_Users": "Invite Users",
"is_also_typing": "is also typing",
"is_also_typing_female": "is also typing",
@ -1302,7 +1304,12 @@
"Stats_Online_Users": "Online Users",
"Stats_Total_Channels": "Total Channels",
"Stats_Total_Direct_Messages": "Total Direct Message Rooms",
"Stats_Total_Livechat_Rooms": "Total Livechat Rooms",
"Stats_Total_Messages": "Total Messages",
"Stats_Total_Messages_Channel": "Total Messages in Channels",
"Stats_Total_Messages_PrivateGroup": "Total Messages in Private Groups",
"Stats_Total_Messages_Direct": "Total Messages in Direct Messages",
"Stats_Total_Messages_Livechat": "Total Messages in Livechats",
"Stats_Total_Private_Groups": "Total Private Groups",
"Stats_Total_Rooms": "Total Rooms",
"Stats_Total_Users": "Total Users",

@ -19,7 +19,7 @@ Importer.CSV = class ImporterCSV extends Importer.Base {
let tempChannels = [];
let tempUsers = [];
const tempMessages = new Map();
for (let entry of zipEntries) {
for (const entry of zipEntries) {
this.logger.debug(`Entry: ${entry.entryName}`);
//Ignore anything that has `__MACOSX` in it's name, as sadly these things seem to mess everything up
@ -98,12 +98,12 @@ Importer.CSV = class ImporterCSV extends Importer.Base {
// Save the messages records to the import record for `startImport` usage
super.updateProgress(Importer.ProgressStep.PREPARING_MESSAGES);
let messagesCount = 0;
for (let [channel, messagesMap] of tempMessages.entries()) {
for (const [channel, messagesMap] of tempMessages.entries()) {
if (!this.messages.get(channel)) {
this.messages.set(channel, new Map());
}
for (let [msgGroupData, msgs] of messagesMap.entries()) {
for (const [msgGroupData, msgs] of messagesMap.entries()) {
messagesCount += msgs.length;
super.updateRecord({ 'messagesstatus': `${channel}/${msgGroupData}` });
@ -141,8 +141,8 @@ Importer.CSV = class ImporterCSV extends Importer.Base {
const started = Date.now();
//Ensure we're only going to import the users that the user has selected
for (let user of importSelection.users) {
for (let u of this.users.users) {
for (const user of importSelection.users) {
for (const u of this.users.users) {
if (u.id === user.user_id) {
u.do_import = user.do_import;
}
@ -151,8 +151,8 @@ Importer.CSV = class ImporterCSV extends Importer.Base {
this.collection.update({ _id: this.users._id }, { $set: { 'users': this.users.users }});
//Ensure we're only importing the channels the user has selected.
for (let channel of importSelection.channels) {
for (let c of this.channels.channels) {
for (const channel of importSelection.channels) {
for (const c of this.channels.channels) {
if (c.id === channel.channel_id) {
c.do_import = channel.do_import;
}
@ -164,7 +164,7 @@ Importer.CSV = class ImporterCSV extends Importer.Base {
Meteor.defer(() => {
super.updateProgress(Importer.ProgressStep.IMPORTING_USERS);
//Import the users
for (let u of this.users.users) {
for (const u of this.users.users) {
if (!u.do_import) {
continue;
}
@ -198,13 +198,13 @@ Importer.CSV = class ImporterCSV extends Importer.Base {
//Import the channels
super.updateProgress(Importer.ProgressStep.IMPORTING_CHANNELS);
for (let c of this.channels.channels) {
for (const c of this.channels.channels) {
if (!c.do_import) {
continue;
}
Meteor.runAsUser(startedByUserId, () => {
let existantRoom = RocketChat.models.Rooms.findOneByName(c.name);
const existantRoom = RocketChat.models.Rooms.findOneByName(c.name);
//If the room exists or the name of it is 'general', then we don't need to create it again
if (existantRoom || c.name.toUpperCase() === 'GENERAL') {
c.rocketId = c.name.toUpperCase() === 'GENERAL' ? 'GENERAL' : existantRoom._id;
@ -212,7 +212,7 @@ Importer.CSV = class ImporterCSV extends Importer.Base {
} else {
//Find the rocketchatId of the user who created this channel
let creatorId = startedByUserId;
for (let u of this.users.users) {
for (const u of this.users.users) {
if (u.username === c.creator && u.do_import) {
creatorId = u.rocketId;
}
@ -234,7 +234,7 @@ Importer.CSV = class ImporterCSV extends Importer.Base {
//Import the Messages
super.updateProgress(Importer.ProgressStep.IMPORTING_MESSAGES);
for (let [ch, messagesMap] of this.messages.entries()) {
for (const [ch, messagesMap] of this.messages.entries()) {
const csvChannel = this.getChannelFromName(ch);
if (!csvChannel.do_import) {
continue;
@ -242,9 +242,9 @@ Importer.CSV = class ImporterCSV extends Importer.Base {
const room = RocketChat.models.Rooms.findOneById(csvChannel.rocketId, { fields: { usernames: 1, t: 1, name: 1 } });
Meteor.runAsUser(startedByUserId, () => {
for (let [msgGroupData, msgs] of messagesMap.entries()) {
for (const [msgGroupData, msgs] of messagesMap.entries()) {
super.updateRecord({ 'messagesstatus': `${ch}/${msgGroupData}.${msgs.messages.length}` });
for (let msg of msgs.messages) {
for (const msg of msgs.messages) {
if (isNaN(new Date(parseInt(msg.ts)))) {
this.logger.warn(`Timestamp on a message in ${ch}/${msgGroupData} is invalid`);
super.addCountCompleted(1);
@ -290,7 +290,7 @@ Importer.CSV = class ImporterCSV extends Importer.Base {
}
getChannelFromName(channelName) {
for (let ch of this.channels.channels) {
for (const ch of this.channels.channels) {
if (ch.name === channelName) {
return ch;
}
@ -298,7 +298,7 @@ Importer.CSV = class ImporterCSV extends Importer.Base {
}
getUserFromUsername(username) {
for (let u of this.users.users) {
for (const u of this.users.users) {
if (u.username === username) {
return RocketChat.models.Users.findOneById(u.rocketId, { fields: { username: 1 }});
}

@ -32,7 +32,7 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
if (info.base === 'users.json') {
super.updateProgress(Importer.ProgressStep.PREPARING_USERS);
for (let u of file) {
for (const u of file) {
tempUsers.push({
id: u.User.id,
email: u.User.email,
@ -45,7 +45,7 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
}
} else if (info.base === 'rooms.json') {
super.updateProgress(Importer.ProgressStep.PREPARING_CHANNELS);
for (let r of file) {
for (const r of file) {
tempRooms.push({
id: r.Room.id,
creator: r.Room.owner,
@ -62,7 +62,7 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
if (dirSplit[1] === 'users') {
const msgs = [];
for (let m of file) {
for (const m of file) {
if (m.PrivateUserMessage) {
msgs.push({
type: 'user',
@ -78,7 +78,7 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
} else if (dirSplit[1] === 'rooms') {
const roomMsgs = [];
for (let m of file) {
for (const m of file) {
if (m.UserMessage) {
roomMsgs.push({
type: 'user',
@ -138,7 +138,7 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
// Save the messages records to the import record for `startImport` usage
super.updateProgress(Importer.ProgressStep.PREPARING_MESSAGES);
let messagesCount = 0;
for (let [channel, msgs] of tempMessages.entries()) {
for (const [channel, msgs] of tempMessages.entries()) {
if (!this.messages.get(channel)) {
this.messages.set(channel, new Map());
}
@ -157,7 +157,7 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
}
}
for (let [directMsgUser, msgs] of tempDirectMessages.entries()) {
for (const [directMsgUser, msgs] of tempDirectMessages.entries()) {
this.logger.debug(`Preparing the direct messages for: ${directMsgUser}`);
if (!this.directMessages.get(directMsgUser)) {
this.directMessages.set(directMsgUser, new Map());
@ -212,8 +212,8 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
const started = Date.now();
//Ensure we're only going to import the users that the user has selected
for (let user of importSelection.users) {
for (let u of this.users.users) {
for (const user of importSelection.users) {
for (const u of this.users.users) {
if (u.id === user.user_id) {
u.do_import = user.do_import;
}
@ -222,8 +222,8 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
this.collection.update({ _id: this.users._id }, { $set: { 'users': this.users.users }});
//Ensure we're only importing the channels the user has selected.
for (let channel of importSelection.channels) {
for (let c of this.channels.channels) {
for (const channel of importSelection.channels) {
for (const c of this.channels.channels) {
if (c.id === channel.channel_id) {
c.do_import = channel.do_import;
}
@ -235,7 +235,7 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
Meteor.defer(() => {
super.updateProgress(Importer.ProgressStep.IMPORTING_USERS);
//Import the users
for (let u of this.users.users) {
for (const u of this.users.users) {
this.logger.debug(`Starting the user import: ${u.username} and are we importing them? ${u.do_import}`);
if (!u.do_import) {
continue;
@ -282,13 +282,13 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
//Import the channels
super.updateProgress(Importer.ProgressStep.IMPORTING_CHANNELS);
for (let c of this.channels.channels) {
for (const c of this.channels.channels) {
if (!c.do_import) {
continue;
}
Meteor.runAsUser(startedByUserId, () => {
let existantRoom = RocketChat.models.Rooms.findOneByName(c.name);
const existantRoom = RocketChat.models.Rooms.findOneByName(c.name);
//If the room exists or the name of it is 'general', then we don't need to create it again
if (existantRoom || c.name.toUpperCase() === 'GENERAL') {
c.rocketId = c.name.toUpperCase() === 'GENERAL' ? 'GENERAL' : existantRoom._id;
@ -296,7 +296,7 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
} else {
//Find the rocketchatId of the user who created this channel
let creatorId = startedByUserId;
for (let u of this.users.users) {
for (const u of this.users.users) {
if (u.id === c.creator && u.do_import) {
creatorId = u.rocketId;
}
@ -318,7 +318,7 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
//Import the Messages
super.updateProgress(Importer.ProgressStep.IMPORTING_MESSAGES);
for (let [ch, messagesMap] of this.messages.entries()) {
for (const [ch, messagesMap] of this.messages.entries()) {
const hipChannel = this.getChannelFromRoomIdentifier(ch);
if (!hipChannel.do_import) {
continue;
@ -326,9 +326,9 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
const room = RocketChat.models.Rooms.findOneById(hipChannel.rocketId, { fields: { usernames: 1, t: 1, name: 1 } });
Meteor.runAsUser(startedByUserId, () => {
for (let [msgGroupData, msgs] of messagesMap.entries()) {
for (const [msgGroupData, msgs] of messagesMap.entries()) {
super.updateRecord({ 'messagesstatus': `${ch}/${msgGroupData}.${msgs.messages.length}` });
for (let msg of msgs.messages) {
for (const msg of msgs.messages) {
if (isNaN(msg.ts)) {
this.logger.warn(`Timestamp on a message in ${ch}/${msgGroupData} is invalid`);
super.addCountCompleted(1);
@ -363,7 +363,7 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
}
//Import the Direct Messages
for (let [directMsgRoom, directMessagesMap] of this.directMessages.entries()) {
for (const [directMsgRoom, directMessagesMap] of this.directMessages.entries()) {
const hipUser = this.getUserFromDirectMessageIdentifier(directMsgRoom);
if (!hipUser.do_import) {
continue;
@ -374,9 +374,9 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
continue;
}
for (let [msgGroupData, msgs] of directMessagesMap.entries()) {
for (const [msgGroupData, msgs] of directMessagesMap.entries()) {
super.updateRecord({ 'messagesstatus': `${directMsgRoom}/${msgGroupData}.${msgs.messages.length}` });
for (let msg of msgs.messages) {
for (const msg of msgs.messages) {
if (isNaN(msg.ts)) {
this.logger.warn(`Timestamp on a message in ${directMsgRoom}/${msgGroupData} is invalid`);
super.addCountCompleted(1);
@ -436,7 +436,7 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
}
getChannelFromRoomIdentifier(roomIdentifier) {
for (let ch of this.channels.channels) {
for (const ch of this.channels.channels) {
if (`rooms/${ch.id}` === roomIdentifier) {
return ch;
}
@ -444,7 +444,7 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
}
getUserFromDirectMessageIdentifier(directIdentifier) {
for (let u of this.users.users) {
for (const u of this.users.users) {
if (`users/${u.id}` === directIdentifier) {
return u;
}
@ -452,7 +452,7 @@ Importer.HipChatEnterprise = class ImporterHipChatEnterprise extends Importer.Ba
}
getRocketUserFromUserId(userId) {
for (let u of this.users.users) {
for (const u of this.users.users) {
if (u.id === userId) {
return RocketChat.models.Users.findOneById(u.rocketId, { fields: { username: 1 }});
}

@ -18,6 +18,13 @@ getIntegrationScript = (integration) ->
return store[key] = val
get: (key) ->
return store[key]
HTTP: (method, url, options) ->
try
return {} =
result: HTTP.call method, url, options
catch e
return {} =
error: e
try
logger.incoming.info 'Will evaluate script of Trigger', integration.name
@ -176,6 +183,13 @@ executeIntegrationRest = ->
return store[key] = val
get: (key) ->
return store[key]
HTTP: (method, url, options) ->
try
return {} =
result: HTTP.call method, url, options
catch e
return {} =
error: e
script: script
request: request
result = vm.runInNewContext('script.process_incoming_request({ request: request })', sandbox, { timeout: 3000 })

@ -170,7 +170,7 @@ LDAP = class LDAP {
};
}
let filter = ['(&'];
const filter = ['(&'];
if (self.options.domain_search_object_category !== '') {
filter.push(`(objectCategory=${self.options.domain_search_object_category})`);
@ -244,7 +244,7 @@ LDAP = class LDAP {
self.bindIfNecessary();
let Unique_Identifier_Field = RocketChat.settings.get('LDAP_Unique_Identifier_Field').split(',');
const Unique_Identifier_Field = RocketChat.settings.get('LDAP_Unique_Identifier_Field').split(',');
let filter;
@ -323,7 +323,7 @@ LDAP = class LDAP {
return true;
}
let filter = ['(&'];
const filter = ['(&'];
if (self.options.group_filter_object_class !== '') {
filter.push(`(objectclass=${self.options.group_filter_object_class})`);

@ -83,7 +83,7 @@ Accounts.registerLoginHandler('ldap', function(loginRequest) {
// Look to see if user already exists
let userQuery;
let Unique_Identifier_Field = getLdapUserUniqueID(ldapUser);
const Unique_Identifier_Field = getLdapUserUniqueID(ldapUser);
let user;
if (Unique_Identifier_Field) {

@ -12,7 +12,7 @@ slug = function slug(text) {
getLdapUsername = function getLdapUsername(ldapUser) {
let usernameField = RocketChat.settings.get('LDAP_Username_Field');
const usernameField = RocketChat.settings.get('LDAP_Username_Field');
if (usernameField.indexOf('#{') > -1) {
return usernameField.replace(/#{(.+?)}/g, function(match, field) {
@ -64,9 +64,9 @@ getDataToSyncUserData = function getDataToSyncUserData(ldapUser, user) {
if (syncUserData && syncUserDataFieldMap) {
const fieldMap = JSON.parse(syncUserDataFieldMap);
let userData = {};
const userData = {};
let emailList = [];
const emailList = [];
_.map(fieldMap, function(userField, ldapField) {
if (!ldapUser.object.hasOwnProperty(ldapField)) {
return;
@ -158,7 +158,7 @@ addLdapUser = function addLdapUser(ldapUser, username, password) {
username: username
};
let userData = getDataToSyncUserData(ldapUser, {});
const userData = getDataToSyncUserData(ldapUser, {});
if (userData && userData.emails) {
userObject.email = userData.emails[0].address;
@ -209,15 +209,13 @@ sync = function sync() {
ldapUsers.forEach(function(ldapUser) {
const username = slug(getLdapUsername(ldapUser));
// Look to see if user already exists
let userQuery;
let user;
userQuery = {
const userQuery = {
username: username
};
logger.debug('userQuery', userQuery);
user = Meteor.users.findOne(userQuery);
const user = Meteor.users.findOne(userQuery);
if (!user) {
addLdapUser(ldapUser, username);

@ -18,7 +18,7 @@ RocketChat.TabBar = new (class TabBar {
return false;
}
let btns = this.buttons.curValue;
const btns = this.buttons.curValue;
btns[config.id] = config;
if (this.extraGroups[config.id]) {
@ -29,13 +29,13 @@ RocketChat.TabBar = new (class TabBar {
}
removeButton(id) {
let btns = this.buttons.curValue;
const btns = this.buttons.curValue;
delete btns[id];
this.buttons.set(btns);
}
updateButton(id, config) {
let btns = this.buttons.curValue;
const btns = this.buttons.curValue;
if (btns[id]) {
btns[id] = _.extend(btns[id], config);
this.buttons.set(btns);
@ -51,7 +51,7 @@ RocketChat.TabBar = new (class TabBar {
}
addGroup(id, groups) {
let btns = this.buttons.curValue;
const btns = this.buttons.curValue;
if (btns[id]) {
btns[id].groups = _.union((btns[id].groups || []), groups);
this.buttons.set(btns);
@ -61,7 +61,7 @@ RocketChat.TabBar = new (class TabBar {
}
removeGroup(id, groups) {
let btns = this.buttons.curValue;
const btns = this.buttons.curValue;
if (btns[id]) {
btns[id].groups = _.difference((btns[id].groups || []), groups);
this.buttons.set(btns);

@ -8,7 +8,7 @@ Meteor.startup(function() {
return handleError(error);
}
for (let record of results) {
for (const record of results) {
UserRoles.upsert({ _id: record._id }, record);
}
});

@ -4,7 +4,7 @@ RocketChat.getURL = (path, { cdn = true, full = false } = {}) => {
let basePath;
let finalPath = _.ltrim(_.trim(path), '/');
const finalPath = _.ltrim(_.trim(path), '/');
if (cdn && cdnPrefix !== '') {
basePath = cdnPrefix + pathPrefix;

@ -1,10 +1,10 @@
RocketChat.addUserToDefaultChannels = function(user, silenced) {
RocketChat.callbacks.run('beforeJoinDefaultChannels', user);
let defaultRooms = RocketChat.models.Rooms.findByDefaultAndTypes(true, ['c', 'p'], {fields: {usernames: 0}}).fetch();
const defaultRooms = RocketChat.models.Rooms.findByDefaultAndTypes(true, ['c', 'p'], {fields: {usernames: 0}}).fetch();
defaultRooms.forEach((room) => {
// put user in default rooms
let muted = room.ro && !RocketChat.authz.hasPermission(user._id, 'post-readonly');
const muted = room.ro && !RocketChat.authz.hasPermission(user._id, 'post-readonly');
RocketChat.models.Rooms.addUsernameById(room._id, user.username, muted);
if (!RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(room._id, user._id)) {

@ -1,9 +1,9 @@
RocketChat.addUserToRoom = function(rid, user, inviter, silenced) {
let now = new Date();
let room = RocketChat.models.Rooms.findOneById(rid);
const now = new Date();
const room = RocketChat.models.Rooms.findOneById(rid);
// Check if user is already in room
let subscription = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(rid, user._id);
const subscription = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(rid, user._id);
if (subscription) {
return;
}

@ -23,7 +23,7 @@ RocketChat.createPrivateGroup = function(name, owner, members) {
throw new Meteor.Error('error-invalid-name', 'Invalid name', { function: 'RocketChat.createPrivateGroup' });
}
let now = new Date();
const now = new Date();
if (!_.contains(members, owner)) {
members.push(owner);
}
@ -40,13 +40,13 @@ RocketChat.createPrivateGroup = function(name, owner, members) {
room = RocketChat.models.Rooms.createWithTypeNameUserAndUsernames('p', name, owner, members, { ts: now });
for (let username of members) {
let member = RocketChat.models.Users.findOneByUsername(username, { fields: { username: 1 }});
for (const username of members) {
const member = RocketChat.models.Users.findOneByUsername(username, { fields: { username: 1 }});
if (!member) {
continue;
}
let extra = { open: true };
const extra = { open: true };
if (username === owner) {
extra.ls = now;

@ -24,7 +24,7 @@ RocketChat.createRoom = function(type, name, owner, members, readOnly, extraData
throw new Meteor.Error('error-invalid-name', 'Invalid name', { function: 'RocketChat.createRoom' });
}
let now = new Date();
const now = new Date();
if (!_.contains(members, owner.username)) {
members.push(owner.username);
}
@ -62,8 +62,8 @@ RocketChat.createRoom = function(type, name, owner, members, readOnly, extraData
room = RocketChat.models.Rooms.createWithTypeNameUserAndUsernames(type, name, owner, members, extraData);
for (let username of members) {
let member = RocketChat.models.Users.findOneByUsername(username, { fields: { username: 1 }});
for (const username of members) {
const member = RocketChat.models.Users.findOneByUsername(username, { fields: { username: 1 }});
if (!member) {
continue;
}
@ -73,7 +73,7 @@ RocketChat.createRoom = function(type, name, owner, members, readOnly, extraData
RocketChat.models.Rooms.muteUsernameByRoomId(room._id, username);
}
let extra = { open: true };
const extra = { open: true };
if (username === owner.username) {
extra.ls = now;

@ -1,7 +1,7 @@
/* globals FileUpload */
RocketChat.deleteMessage = function(message, user) {
let keepHistory = RocketChat.settings.get('Message_KeepHistory');
let showDeletedStatus = RocketChat.settings.get('Message_ShowDeletedStatus');
const keepHistory = RocketChat.settings.get('Message_KeepHistory');
const showDeletedStatus = RocketChat.settings.get('Message_ShowDeletedStatus');
let deletedMsg;
if (keepHistory) {

@ -4,7 +4,7 @@ RocketChat.deleteUser = function(userId) {
RocketChat.models.Messages.removeByUserId(userId); // Remove user messages
RocketChat.models.Subscriptions.findByUserId(userId).forEach((subscription) => {
let room = RocketChat.models.Rooms.findOneById(subscription.rid);
const room = RocketChat.models.Rooms.findOneById(subscription.rid);
if (room) {
if (room.t !== 'c' && room.usernames.length === 1) {
RocketChat.models.Rooms.removeById(subscription.rid); // Remove non-channel rooms with only 1 user (the one being deleted)

@ -1,12 +1,12 @@
RocketChat.removeUserFromRoom = function(rid, user) {
let room = RocketChat.models.Rooms.findOneById(rid);
const room = RocketChat.models.Rooms.findOneById(rid);
if (room) {
RocketChat.callbacks.run('beforeLeaveRoom', user, room);
RocketChat.models.Rooms.removeUsernameById(rid, user.username);
if (room.usernames.indexOf(user.username) !== -1) {
let removedUser = user;
const removedUser = user;
RocketChat.models.Messages.createUserLeaveWithRoomIdAndUser(rid, removedUser);
}

@ -7,10 +7,10 @@ RocketChat.saveCustomFields = function(userId, formData) {
throw new Meteor.Error('error-invalid-customfield-json', 'Invalid JSON for Custom Fields');
}
let customFields = {};
const customFields = {};
Object.keys(customFieldsMeta).forEach((fieldName) => {
let field = customFieldsMeta[fieldName];
const field = customFieldsMeta[fieldName];
customFields[fieldName] = formData[fieldName];
if (field.required && !formData[fieldName]) {
@ -38,8 +38,8 @@ RocketChat.saveCustomFields = function(userId, formData) {
return;
}
let modifyRecordField = customFieldsMeta[fieldName].modifyRecordField;
let update = {};
const modifyRecordField = customFieldsMeta[fieldName].modifyRecordField;
const update = {};
if (modifyRecordField.array) {
update.$addToSet = {};
update.$addToSet[modifyRecordField.field] = customFields[fieldName];

@ -1,7 +1,7 @@
/* globals Gravatar */
RocketChat.saveUser = function(userId, userData) {
const user = RocketChat.models.Users.findOneById(userId);
let existingRoles = _.pluck(RocketChat.authz.getRoles(), '_id');
const existingRoles = _.pluck(RocketChat.authz.getRoles(), '_id');
if (userData._id && userId !== userData._id && !RocketChat.authz.hasPermission(userId, 'edit-other-user-info')) {
throw new Meteor.Error('error-action-not-allowed', 'Editing user is not allowed', { method: 'insertOrUpdateUser', action: 'Editing_user' });
@ -87,7 +87,7 @@ RocketChat.saveUser = function(userId, userData) {
const header = RocketChat.placeholders.replace(RocketChat.settings.get('Email_Header') || '');
const footer = RocketChat.placeholders.replace(RocketChat.settings.get('Email_Footer') || '');
let subject, html, email;
let subject, html;
if (RocketChat.settings.get('Accounts_UserAddedEmail_Customized')) {
subject = RocketChat.settings.get('Accounts_UserAddedEmailSubject');
@ -104,7 +104,7 @@ RocketChat.saveUser = function(userId, userData) {
password: userData.password
});
email = {
const email = {
to: userData.email,
from: RocketChat.settings.get('From_Email'),
subject: subject,
@ -123,7 +123,7 @@ RocketChat.saveUser = function(userId, userData) {
userData._id = _id;
if (RocketChat.settings.get('Accounts_SetDefaultAvatar') === true && userData.email) {
let gravatarUrl = Gravatar.imageUrl(userData.email, {default: '404', size: 200, secure: true});
const gravatarUrl = Gravatar.imageUrl(userData.email, {default: '404', size: 200, secure: true});
try {
RocketChat.setUserAvatar(userData, gravatarUrl, '', 'url');

@ -32,15 +32,15 @@ RocketChat.setUserAvatar = function(user, dataURI, contentType, service) {
encoding = 'binary';
image = dataURI;
} else {
let fileData = RocketChatFile.dataURIParse(dataURI);
const fileData = RocketChatFile.dataURIParse(dataURI);
encoding = 'base64';
image = fileData.image;
contentType = fileData.contentType;
}
let rs = RocketChatFile.bufferToStream(new Buffer(image, encoding));
const rs = RocketChatFile.bufferToStream(new Buffer(image, encoding));
RocketChatFileAvatarInstance.deleteFile(encodeURIComponent(`${user.username}.jpg`));
let ws = RocketChatFileAvatarInstance.createWriteStream(encodeURIComponent(`${user.username}.jpg`), contentType);
const ws = RocketChatFileAvatarInstance.createWriteStream(encodeURIComponent(`${user.username}.jpg`), contentType);
ws.on('end', Meteor.bindEnvironment(function() {
Meteor.setTimeout(function() {
RocketChat.models.Users.setAvatarOrigin(user._id, service);

@ -10,19 +10,19 @@ RocketChat.updateMessage = function(message, user) {
username: user.username
};
let urls = message.msg.match(/([A-Za-z]{3,9}):\/\/([-;:&=\+\$,\w]+@{1})?([-A-Za-z0-9\.]+)+:?(\d+)?((\/[-\+=!:~%\/\.@\,\w]*)?\??([-\+=&!:;%@\/\.\,\w]+)?(?:#([^\s\)]+))?)?/g);
const urls = message.msg.match(/([A-Za-z]{3,9}):\/\/([-;:&=\+\$,\w]+@{1})?([-A-Za-z0-9\.]+)+:?(\d+)?((\/[-\+=!:~%\/\.@\,\w]*)?\??([-\+=&!:;%@\/\.\,\w]+)?(?:#([^\s\)]+))?)?/g);
if (urls) {
message.urls = urls.map((url) => { return { url: url }; });
}
message = RocketChat.callbacks.run('beforeSaveMessage', message);
let tempid = message._id;
const tempid = message._id;
delete message._id;
RocketChat.models.Messages.update({ _id: tempid }, { $set: message });
let room = RocketChat.models.Rooms.findOneById(message.rid);
const room = RocketChat.models.Rooms.findOneById(message.rid);
Meteor.defer(function() {
RocketChat.callbacks.run('afterSaveMessage', RocketChat.models.Messages.findOneById(tempid), room);

@ -1,7 +1,7 @@
/* globals Push */
class PushNotification {
getNotificationId(roomId) {
let serverId = RocketChat.settings.get('uniqueID');
const serverId = RocketChat.settings.get('uniqueID');
return this.hash(`${serverId}|${roomId}`); // hash
}
@ -24,7 +24,7 @@ class PushNotification {
} else {
title = `${username}`;
}
let icon = RocketChat.settings.get('Assets_favicon_192').url || RocketChat.settings.get('Assets_favicon_192').defaultUrl;
const icon = RocketChat.settings.get('Assets_favicon_192').url || RocketChat.settings.get('Assets_favicon_192').defaultUrl;
const config = {
from: 'push',
badge: 1,

@ -26,7 +26,7 @@ process.on('uncaughtException', Meteor.bindEnvironment((error) => {
throw error;
}));
let originalMeteorDebug = Meteor._debug;
const originalMeteorDebug = Meteor._debug;
Meteor._debug = function() {
notify(...arguments);
return originalMeteorDebug(...arguments);

@ -1,12 +1,18 @@
import moment from 'moment';
RocketChat.callbacks.add('afterSaveMessage', function(message, room) {
// skips this callback if the message was edited
if (message.editedAt) {
// skips this callback if the message was edited and increments it if the edit was way in the past (aka imported)
if (message.editedAt && Math.abs(moment(message.editedAt).diff()) > 60000) {
//TODO: Review as I am not sure how else to get around this as the incrementing of the msgs count shouldn't be in this callback
RocketChat.models.Rooms.incMsgCountById(message.rid, 1);
return message;
} else if (message.editedAt) {
// skips this callback if the message was edited
return message;
}
if (message.ts && Math.abs(moment(message.ts).diff()) > 60000) {
RocketChat.models.Rooms.incMsgCountById(message.rid, 1);
return message;
}

@ -1,36 +1,8 @@
Meteor.methods({
addUserToRoom(data) {
if (!Meteor.userId()) {
throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'addUserToRoom' });
}
if (!Match.test(data && data.rid, String)) {
throw new Meteor.Error('error-invalid-room', 'Invalid room', { method: 'addUserToRoom' });
}
if (!Match.test(data && data.username, String)) {
throw new Meteor.Error('error-invalid-username', 'Invalid username', { method: 'addUserToRoom' });
}
const room = RocketChat.models.Rooms.findOneById(data.rid);
if (room.usernames.indexOf(Meteor.user().username) === -1) {
throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'addUserToRoom' });
}
const fromId = Meteor.userId();
if (!RocketChat.authz.hasPermission(fromId, 'add-user-to-room', room._id)) {
throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'addUserToRoom' });
}
if (room.t === 'd') {
throw new Meteor.Error('error-cant-invite-for-direct-room', 'Can\'t invite user to direct rooms', { method: 'addUserToRoom' });
}
const newUser = RocketChat.models.Users.findOneByUsername(data.username);
RocketChat.addUserToRoom(data.rid, newUser, Meteor.user());
return true;
addUserToRoom: function(data) {
return Meteor.call('addUsersToRoom', {
rid: data.rid,
users: [ data.username ]
});
}
});

@ -1,40 +1,67 @@
Meteor.methods({
addUsersToRoom: function(data) {
var fromId, room;
addUsersToRoom(data = {}) {
// Validate user and room
if (!Meteor.userId()) {
throw new Meteor.Error('error-invalid-user', 'Invalid user', {
method: 'addUserToRoom'
method: 'addUsersToRoom'
});
}
if (!Match.test(data != null ? data.rid : void 0, String)) {
if (!Match.test(data.rid, String)) {
throw new Meteor.Error('error-invalid-room', 'Invalid room', {
method: 'addUserToRoom'
method: 'addUsersToRoom'
});
}
room = RocketChat.models.Rooms.findOneById(data.rid);
if (room.usernames.indexOf(Meteor.user().username) === -1) {
throw new Meteor.Error('error-not-allowed', 'Not allowed', {
method: 'addUserToRoom'
// Get user and room details
const room = RocketChat.models.Rooms.findOneById(data.rid);
const userId = Meteor.userId();
const user = Meteor.user();
const userInRoom = Array.isArray(room.usernames) && room.usernames.includes(user.username);
// Can't add to direct room ever
if (room.t === 'd') {
throw new Meteor.Error('error-cant-invite-for-direct-room', 'Can\'t invite user to direct rooms', {
method: 'addUsersToRoom'
});
}
fromId = Meteor.userId();
if (!RocketChat.authz.hasPermission(fromId, 'add-user-to-room', room._id)) {
// Can add to any room you're in, with permission, otherwise need specific room type permission
let canAddUser = false;
if (userInRoom && RocketChat.authz.hasPermission(userId, 'add-user-to-joined-room', room._id)) {
canAddUser = true;
} else if (room.t === 'c' && RocketChat.authz.hasPermission(userId, 'add-user-to-any-c-room')) {
canAddUser = true;
} else if (room.t === 'p' && RocketChat.authz.hasPermission(userId, 'add-user-to-any-p-room')) {
canAddUser = true;
}
// Adding wasn't allowed
if (!canAddUser) {
throw new Meteor.Error('error-not-allowed', 'Not allowed', {
method: 'addUserToRoom'
method: 'addUsersToRoom'
});
}
if (room.t === 'd') {
throw new Meteor.Error('error-cant-invite-for-direct-room', 'Can\'t invite user to direct rooms', {
method: 'addUserToRoom'
// Missing the users to be added
if (!Array.isArray(data.users)) {
throw new Meteor.Error('error-invalid-arguments', 'Invalid arguments', {
method: 'addUsersToRoom'
});
}
data.users = Array.isArray(data.users) ? data.users : [];
data.users.forEach(function(username) {
let newUser = RocketChat.models.Users.findOneByUsername(username);
RocketChat.addUserToRoom(data.rid, newUser, Meteor.user());
// Validate each user, then add to room
data.users.forEach((username) => {
const newUser = RocketChat.models.Users.findOneByUsername(username);
if (!newUser) {
throw new Meteor.Error('error-invalid-username', 'Invalid username', {
method: 'addUsersToRoom'
});
}
RocketChat.addUserToRoom(data.rid, newUser, user);
});
return true;
}
});
});

@ -7,8 +7,8 @@ RocketChat.callbacks.add('beforeSaveMessage', function(message) {
if (!RocketChat.authz.hasPermission(message.u._id, 'mention-all')) {
// Get the language of the user for the error notification.
let language = RocketChat.models.Users.findOneById(message.u._id).language;
let action = TAPi18n.__('Notify_all_in_this_room', {}, language);
const language = RocketChat.models.Users.findOneById(message.u._id).language;
const action = TAPi18n.__('Notify_all_in_this_room', {}, language);
// Add a notification to the chat, informing the user that this
// action is not allowed.

@ -20,8 +20,8 @@ Meteor.methods({
// Security issue: we should not send all user's roles to all clients, only the 'public' roles
// We must remove all roles that are not part of the query from the returned users
let users = RocketChat.models.Users.findUsersInRoles(roleIds, null, options).fetch();
for (let user of users) {
const users = RocketChat.models.Users.findUsersInRoles(roleIds, null, options).fetch();
for (const user of users) {
user.roles = _.intersection(user.roles, roleIds);
}
return users;

@ -22,7 +22,7 @@ Meteor.methods({
// If user is room owner, check if there are other owners. If there isn't anyone else, warn user to set a new owner.
if (RocketChat.authz.hasRole(user._id, 'owner', room._id)) {
let numOwners = RocketChat.authz.getUsersInRole('owner', room._id).fetch().length;
const numOwners = RocketChat.authz.getUsersInRole('owner', room._id).fetch().length;
if (numOwners === 1) {
throw new Meteor.Error('error-you-are-last-owner', 'You are the last owner. Please set new owner before leaving the room.', { method: 'leaveRoom' });
}

@ -385,6 +385,7 @@ RocketChat.models.Messages = new class extends RocketChat.models._Base
_.extend record, extraData
record._id = @insertOrUpsert record
RocketChat.models.Rooms.incMsgCountById(room._id, 1)
return record
createUserJoinWithRoomIdAndUser: (roomId, user, extraData) ->

@ -397,6 +397,16 @@ class ModelRooms extends RocketChat.models._Base
return @update query, update
incMsgCountById: (_id, inc=1) ->
query =
_id: _id
update =
$inc:
msgs: inc
return @update query, update
incMsgCountAndSetLastMessageTimestampById: (_id, inc=1, lastMessageTimestamp) ->
query =
_id: _id

@ -552,8 +552,8 @@ class ModelsBaseCache extends EventEmitter {
fieldsToGet.push('_id');
}
let pickFields = (obj, fields) => {
let picked = {};
const pickFields = (obj, fields) => {
const picked = {};
fields.forEach((field) => {
if (field.indexOf('.') !== -1) {
objectPath.set(picked, field, objectPath.get(obj, field));
@ -756,7 +756,7 @@ class ModelsBaseCache extends EventEmitter {
this.emit('beforeupdate', record, diff);
}
for (let key in diff) {
for (const key in diff) {
if (diff.hasOwnProperty(key)) {
objectPath.set(record, key, diff[key]);
}
@ -799,7 +799,7 @@ class ModelsBaseCache extends EventEmitter {
if (update.$min) {
_.each(update.$min, (value, field) => {
let curValue = objectPath.get(record, field);
const curValue = objectPath.get(record, field);
if (curValue === undefined || value < curValue) {
objectPath.set(record, field, value);
}
@ -808,7 +808,7 @@ class ModelsBaseCache extends EventEmitter {
if (update.$max) {
_.each(update.$max, (value, field) => {
let curValue = objectPath.get(record, field);
const curValue = objectPath.get(record, field);
if (curValue === undefined || value > curValue) {
objectPath.set(record, field, value);
}
@ -841,7 +841,7 @@ class ModelsBaseCache extends EventEmitter {
if (update.$rename) {
_.each(update.$rename, (value, field) => {
let curValue = objectPath.get(record, field);
const curValue = objectPath.get(record, field);
if (curValue !== undefined) {
objectPath.set(record, value, curValue);
objectPath.del(record, field);
@ -861,7 +861,7 @@ class ModelsBaseCache extends EventEmitter {
if (update.$pop) {
_.each(update.$pop, (value, field) => {
let curValue = objectPath.get(record, field);
const curValue = objectPath.get(record, field);
if (Array.isArray(curValue)) {
if (value === -1) {
curValue.shift();

@ -11,7 +11,7 @@ try {
console.log(e);
}
let isOplogAvailable = MongoInternals.defaultRemoteCollectionDriver().mongo._oplogHandle && !!MongoInternals.defaultRemoteCollectionDriver().mongo._oplogHandle.onOplogEntry;
const isOplogAvailable = MongoInternals.defaultRemoteCollectionDriver().mongo._oplogHandle && !!MongoInternals.defaultRemoteCollectionDriver().mongo._oplogHandle.onOplogEntry;
let isOplogEnabled = isOplogAvailable;
RocketChat.settings.get('Force_Disable_OpLog_For_Cache', (key, value) => {
isOplogEnabled = isOplogAvailable && value === false;
@ -202,9 +202,9 @@ class ModelsBaseDb extends EventEmitter {
return;
}
let diff = {};
const diff = {};
if (action.op.o.$set) {
for (let key in action.op.o.$set) {
for (const key in action.op.o.$set) {
if (action.op.o.$set.hasOwnProperty(key)) {
diff[key] = action.op.o.$set[key];
}
@ -212,7 +212,7 @@ class ModelsBaseDb extends EventEmitter {
}
if (action.op.o.$unset) {
for (let key in action.op.o.$unset) {
for (const key in action.op.o.$unset) {
if (action.op.o.$unset.hasOwnProperty(key)) {
diff[key] = undefined;
}
@ -259,7 +259,7 @@ class ModelsBaseDb extends EventEmitter {
update(query, update, options = {}) {
this.setUpdatedAt(update, true, query);
let strategy = this.defineSyncStrategy(query, update, options);
const strategy = this.defineSyncStrategy(query, update, options);
let ids = [];
if (!isOplogEnabled && this.listenerCount('change') > 0 && strategy === 'db') {
const findOptions = {fields: {_id: 1}};

@ -46,7 +46,7 @@ LivechatVideoCall = new (class LivechatVideoCall {
start(domain, room) {
Meteor.defer(() => {
let interfaceConfig = {};
const interfaceConfig = {};
interfaceConfig['TOOLBAR_BUTTONS'] = '[""]';
interfaceConfig['APP_NAME'] = '"Livechat"';
interfaceConfig['INITIAL_TOOLBAR_TIMEOUT'] = '5000';

@ -14,7 +14,7 @@ this.Commands = {
promptTranscript: function() {
if (Livechat.transcript) {
const user = Meteor.user();
let email = user.visitorEmails && user.visitorEmails.length > 0 ? user.visitorEmails[0].address : '';
const email = user.visitorEmails && user.visitorEmails.length > 0 ? user.visitorEmails[0].address : '';
swal({
title: t('Chat_ended'),

@ -24,7 +24,7 @@
@quaternary-font-color: rgba(255, 255, 255, 0.85);
@info-font-color: #aaaaaa;
@status-online: #35ac19;
@status-online: #4dff4d;
@status-offline: rgba(150, 150, 150, 0.5);
@status-busy: #d30230;
@status-away: #fcb316;

@ -66,7 +66,7 @@ Template.livechatWindow.onCreated(function() {
const defaultAppLanguage = () => {
let lng = window.navigator.userLanguage || window.navigator.language || 'en';
let regexp = /([a-z]{2}-)([a-z]{2})/;
const regexp = /([a-z]{2}-)([a-z]{2})/;
if (regexp.test(lng)) {
lng = lng.replace(regexp, function(match, ...parts) {
return parts[0] + parts[1].toUpperCase();

@ -94,8 +94,8 @@ Template.messages.events({
return instance.chatMessages.keydown(visitor.getRoom(), event, instance);
},
'click .send-button': function(event, instance) {
let input = instance.find('.input-message');
let sent = instance.chatMessages.send(visitor.getRoom(), input);
const input = instance.find('.input-message');
const sent = instance.chatMessages.send(visitor.getRoom(), input);
input.focus();
instance.updateMessageInputHeight(input);
@ -145,8 +145,7 @@ Template.messages.onCreated(function() {
// even if the scrollHeight become bigger than that it should never exceed that.
// Account for no text in the textarea when increasing the height.
// If there is no text, reset the height.
let inputScrollHeight;
inputScrollHeight = $(input).prop('scrollHeight');
const inputScrollHeight = $(input).prop('scrollHeight');
if (inputScrollHeight > 28) {
return $(input).height($(input).val() === '' ? '15px' : (inputScrollHeight >= 200 ? inputScrollHeight - 50 : inputScrollHeight - 20));
}
@ -156,7 +155,7 @@ Template.messages.onCreated(function() {
if (!this.showOptions.get()) {
return;
}
let target = $(event.target);
const target = $(event.target);
if (!target.closest('.options-menu').length && !target.is('.options-menu') && !target.closest('.toggle-options').length && !target.is('.toggle-options')) {
this.showOptions.set(false);
}

@ -20,7 +20,7 @@ Template.offlineForm.events({
const form = event.currentTarget;
let data = {
const data = {
name: form.elements['name'].value,
email: form.elements['email'].value,
message: form.elements['message'].value

@ -26,7 +26,7 @@ Template.register.events({
var $email, $name;
e.preventDefault();
let start = () => {
const start = () => {
instance.hideError();
if (instance.request === 'video') {
LivechatVideoCall.request();

@ -6,7 +6,7 @@ Meteor.methods({
const user = Meteor.user();
let newStatus = user.statusLivechat === 'available' ? 'not-available' : 'available';
const newStatus = user.statusLivechat === 'available' ? 'not-available' : 'available';
Meteor.users.update(user._id, { $set: { statusLivechat: newStatus }});
}

@ -33,7 +33,7 @@ Template.livechatCurrentChats.events({
'submit form'(event, instance) {
event.preventDefault();
let filter = {};
const filter = {};
$(':input', event.currentTarget).each(function() {
if (this.name) {
filter[this.name] = $(this).val();

@ -14,7 +14,7 @@ Template.livechatDepartmentForm.helpers({
return AgentUsers.find({ username: { $nin: selected }}, { sort: { username: 1 } });
},
showOnRegistration(value) {
let department = Template.instance().department.get();
const department = Template.instance().department.get();
return department.showOnRegistration === value || (department.showOnRegistration === undefined && value === true);
}
});

@ -1,6 +1,6 @@
Template.livechatInstallation.helpers({
script() {
let siteUrl = s.rtrim(RocketChat.settings.get('Site_Url'), '/');
const siteUrl = s.rtrim(RocketChat.settings.get('Site_Url'), '/');
return `<!-- Start of Rocket.Chat Livechat Script -->
<script type="text/javascript">

@ -2,22 +2,22 @@ import toastr from 'toastr';
/* globals LivechatIntegration */
Template.livechatIntegrations.helpers({
webhookUrl() {
let setting = LivechatIntegration.findOne('Livechat_webhookUrl');
const setting = LivechatIntegration.findOne('Livechat_webhookUrl');
return setting && setting.value;
},
secretToken() {
let setting = LivechatIntegration.findOne('Livechat_secret_token');
const setting = LivechatIntegration.findOne('Livechat_secret_token');
return setting && setting.value;
},
disableTest() {
return Template.instance().disableTest.get();
},
sendOnCloseChecked() {
let setting = LivechatIntegration.findOne('Livechat_webhook_on_close');
const setting = LivechatIntegration.findOne('Livechat_webhook_on_close');
return setting && setting.value;
},
sendOnOfflineChecked() {
let setting = LivechatIntegration.findOne('Livechat_webhook_on_offline_msg');
const setting = LivechatIntegration.findOne('Livechat_webhook_on_offline_msg');
return setting && setting.value;
}
});
@ -26,7 +26,7 @@ Template.livechatIntegrations.onCreated(function() {
this.disableTest = new ReactiveVar(true);
this.autorun(() => {
let webhook = LivechatIntegration.findOne('Livechat_webhookUrl');
const webhook = LivechatIntegration.findOne('Livechat_webhookUrl');
this.disableTest.set(!webhook || _.isEmpty(webhook.value));
});
@ -35,7 +35,7 @@ Template.livechatIntegrations.onCreated(function() {
Template.livechatIntegrations.events({
'change #webhookUrl, blur #webhookUrl'(e, instance) {
let setting = LivechatIntegration.findOne('Livechat_webhookUrl');
const setting = LivechatIntegration.findOne('Livechat_webhookUrl');
instance.disableTest.set(!setting || e.currentTarget.value !== setting.value);
},
'click .test'(e, instance) {
@ -51,10 +51,10 @@ Template.livechatIntegrations.events({
'click .reset-settings'(e, instance) {
e.preventDefault();
let webhookUrl = LivechatIntegration.findOne('Livechat_webhookUrl');
let secretToken = LivechatIntegration.findOne('Livechat_secret_token');
let webhookOnClose = LivechatIntegration.findOne('Livechat_webhook_on_close');
let webhookOnOfflineMsg = LivechatIntegration.findOne('Livechat_webhook_on_offline_msg');
const webhookUrl = LivechatIntegration.findOne('Livechat_webhookUrl');
const secretToken = LivechatIntegration.findOne('Livechat_secret_token');
const webhookOnClose = LivechatIntegration.findOne('Livechat_webhook_on_close');
const webhookOnOfflineMsg = LivechatIntegration.findOne('Livechat_webhook_on_offline_msg');
instance.$('#webhookUrl').val(webhookUrl && webhookUrl.value);
instance.$('#secretToken').val(secretToken && secretToken.value);

@ -12,9 +12,9 @@ Template.livechatQueue.helpers({
},
users() {
let users = [];
const users = [];
let showOffline = Template.instance().showOffline.get();
const showOffline = Template.instance().showOffline.get();
LivechatQueueUser.find({
departmentId: this._id
@ -25,9 +25,9 @@ Template.livechatQueue.helpers({
username: 1
}
}).forEach((user) => {
let options = { fields: { _id: 1 } };
let userFilter = { _id: user.agentId, status: { $ne: 'offline' } };
let agentFilter = { _id: user.agentId, statusLivechat: 'available' };
const options = { fields: { _id: 1 } };
const userFilter = { _id: user.agentId, status: { $ne: 'offline' } };
const agentFilter = { _id: user.agentId, statusLivechat: 'available' };
if (showOffline[this._id] || (Meteor.users.findOne(userFilter, options) && AgentUsers.findOne(agentFilter, options))) {
users.push(user);
@ -45,7 +45,7 @@ Template.livechatQueue.helpers({
Template.livechatQueue.events({
'click .show-offline'(event, instance) {
let showOffline = instance.showOffline.get();
const showOffline = instance.showOffline.get();
showOffline[this._id] = event.currentTarget.checked;

@ -44,8 +44,8 @@ Template.visitorEdit.events({
'submit form'(event, instance) {
console.log('this ->', this);
event.preventDefault();
let userData = { _id: instance.visitor.get()._id };
let roomData = { _id: instance.room.get()._id };
const userData = { _id: instance.visitor.get()._id };
const roomData = { _id: instance.room.get()._id };
userData.name = event.currentTarget.elements['name'].value;
userData.email = event.currentTarget.elements['email'].value;

@ -30,27 +30,27 @@ Template.visitorInfo.helpers({
},
customFields() {
let fields = [];
const fields = [];
let livechatData = {};
const user = Template.instance().user.get();
if (user) {
livechatData = _.extend(livechatData, user.livechatData);
}
let data = Template.currentData();
const data = Template.currentData();
if (data && data.rid) {
let room = RocketChat.models.Rooms.findOne(data.rid);
const room = RocketChat.models.Rooms.findOne(data.rid);
if (room) {
livechatData = _.extend(livechatData, room.livechatData);
}
}
if (!_.isEmpty(livechatData)) {
for (let _id in livechatData) {
for (const _id in livechatData) {
if (livechatData.hasOwnProperty(_id)) {
let customFields = Template.instance().customFields.get();
const customFields = Template.instance().customFields.get();
if (customFields) {
let field = _.findWhere(customFields, { _id: _id });
const field = _.findWhere(customFields, { _id: _id });
if (field && field.visibility !== 'hidden') {
fields.push({ label: field.label, value: livechatData[_id] });
}
@ -229,7 +229,7 @@ Template.visitorInfo.onCreated(function() {
if (currentData && currentData.rid) {
this.autorun(() => {
let room = ChatRoom.findOne(currentData.rid);
const room = ChatRoom.findOne(currentData.rid);
if (room && room.v && room.v._id) {
this.visitorId.set(room.v._id);
} else {

@ -6,7 +6,7 @@ RocketChat.API.v1.addRoute('livechat/sms-incoming/:service', {
var visitor = RocketChat.models.Users.findOneVisitorByPhone(sms.from);
let sendMessage = {
const sendMessage = {
message: {
_id: Random.id()
},
@ -30,7 +30,7 @@ RocketChat.API.v1.addRoute('livechat/sms-incoming/:service', {
sendMessage.message.rid = Random.id();
sendMessage.message.token = Random.id();
let userId = RocketChat.Livechat.registerGuest({
const userId = RocketChat.Livechat.registerGuest({
username: sms.from.replace(/[^0-9]/g, ''),
token: sendMessage.message.token,
phone: {

@ -18,7 +18,7 @@ RocketChat.API.v1.addRoute('livechat/users/:type', { authRequired: true }, {
throw 'Invalid type';
}
let users = RocketChat.authz.getUsersInRole(role);
const users = RocketChat.authz.getUsersInRole(role);
return RocketChat.API.v1.success({
users: users.fetch().map(user => ({ _id: user._id, username: user.username }))

@ -17,7 +17,7 @@ WebApp.connectHandlers.use('/livechat', Meteor.bindEnvironment((req, res, next)
return domain.trim();
});
let referer = url.parse(req.headers.referer);
const referer = url.parse(req.headers.referer);
if (!_.contains(domainWhiteList, referer.host)) {
res.setHeader('X-FRAME-OPTIONS', 'DENY');
return next();

@ -33,7 +33,7 @@ RocketChat.roomTypes.add('l', 5, {
},
canSendMessage(roomId) {
let room = ChatRoom.findOne({ _id: roomId }, { fields: { open: 1 } });
const room = ChatRoom.findOne({ _id: roomId }, { fields: { open: 1 } });
return room && room.open === true;
},

@ -15,7 +15,7 @@ RocketChat.callbacks.add('afterSaveMessage', function(message, room) {
}
Meteor.defer(() => {
let now = new Date();
const now = new Date();
RocketChat.models.Rooms.setResponseByRoomId(room._id, {
user: {
_id: message.u._id,

@ -3,7 +3,7 @@ RocketChat.callbacks.add('livechat.offlineMessage', (data) => {
return data;
}
let postData = {
const postData = {
type: 'LivechatOfflineMessage',
sentAt: new Date(),
visitor: {

@ -8,7 +8,7 @@ function sendToCRM(hook, room) {
return room;
}
let postData = RocketChat.Livechat.getLivechatRoomGuestInfo(room);
const postData = RocketChat.Livechat.getLivechatRoomGuestInfo(room);
if (hook === 'closeRoom') {
postData.type = 'LivechatSession';
} else if (hook === 'saveLivechatInfo') {
@ -21,7 +21,7 @@ function sendToCRM(hook, room) {
if (message.t) {
return;
}
let msg = {
const msg = {
username: message.u.username,
msg: message.msg,
ts: message.ts

@ -68,7 +68,7 @@ RocketChat.Livechat = {
return { room, newRoom };
},
sendMessage({ guest, message, roomInfo }) {
let { room, newRoom } = this.getRoom(guest, message, roomInfo);
const { room, newRoom } = this.getRoom(guest, message, roomInfo);
if (guest.name) {
message.alias = guest.name;
}
@ -80,7 +80,7 @@ RocketChat.Livechat = {
check(token, String);
let userId;
let updateUser = {
const updateUser = {
$set: {
profile: {
guest: true,
@ -162,7 +162,7 @@ RocketChat.Livechat = {
},
saveGuest({ _id, name, email, phone }) {
let updateData = {};
const updateData = {};
if (name) {
updateData.name = name;
@ -183,7 +183,7 @@ RocketChat.Livechat = {
},
closeRoom({ user, room, comment }) {
let now = new Date();
const now = new Date();
RocketChat.models.Rooms.closeByRoomId(room._id, {
user: {
_id: user._id,
@ -212,7 +212,7 @@ RocketChat.Livechat = {
},
getInitSettings() {
let settings = {};
const settings = {};
RocketChat.models.Settings.findNotHiddenPublic([
'Livechat_title',
@ -293,7 +293,7 @@ RocketChat.Livechat = {
RocketChat.models.Rooms.changeAgentByRoomId(room._id, agent);
let subscriptionData = {
const subscriptionData = {
rid: room._id,
name: guest.name || guest.username,
alert: true,
@ -329,7 +329,7 @@ RocketChat.Livechat = {
sendRequest(postData, callback, trying = 1) {
try {
let options = {
const options = {
headers: {
'X-RocketChat-Livechat-Token': RocketChat.settings.get('Livechat_secret_token')
},
@ -356,7 +356,7 @@ RocketChat.Livechat = {
const ua = new UAParser();
ua.setUA(visitor.userAgent);
let postData = {
const postData = {
_id: room._id,
label: room.label,
topic: room.topic,

@ -34,7 +34,7 @@ RocketChat.QueueMethods = {
open: true,
waitingResponse: true
}, roomInfo);
let subscriptionData = {
const subscriptionData = {
rid: message.rid,
name: guest.name || guest.username,
alert: true,

@ -6,7 +6,7 @@ Meteor.methods({
const user = Meteor.user();
let newStatus = user.statusLivechat === 'available' ? 'not-available' : 'available';
const newStatus = user.statusLivechat === 'available' ? 'not-available' : 'available';
return RocketChat.models.Users.setLivechatStatus(user._id, newStatus);
}

@ -12,7 +12,7 @@ Meteor.methods({
const user = Meteor.user();
let language = (user && user.language) || RocketChat.settings.get('language') || 'en';
const language = (user && user.language) || RocketChat.settings.get('language') || 'en';
return RocketChat.Livechat.closeRoom({
user: user,

@ -9,7 +9,7 @@ Meteor.methods({
const stampedToken = Accounts._generateStampedLoginToken();
const hashStampedToken = Accounts._hashStampedToken(stampedToken);
let updateUser = {
const updateUser = {
$set: {
services: {
resume: {

@ -3,7 +3,7 @@ Meteor.methods({
var stampedToken = Accounts._generateStampedLoginToken();
var hashStampedToken = Accounts._hashStampedToken(stampedToken);
let userId = RocketChat.Livechat.registerGuest.call(this, {
const userId = RocketChat.Livechat.registerGuest.call(this, {
token: token,
name: name,
email: email,

@ -7,14 +7,14 @@ Meteor.methods({
const guest = Meteor.user();
let message = {
const message = {
_id: Random.id(),
rid: roomId || Random.id(),
msg: '',
ts: new Date()
};
let { room } = RocketChat.Livechat.getRoom(guest, message, { jitsiTimeout: new Date(Date.now() + 3600 * 1000) });
const { room } = RocketChat.Livechat.getRoom(guest, message, { jitsiTimeout: new Date(Date.now() + 3600 * 1000) });
message.rid = room._id;
RocketChat.models.Messages.createWithTypeRoomIdMessageAndUser('livechat_video_call', room._id, '', guest, {

@ -61,14 +61,14 @@ Meteor.methods({
}]
};
let options = {
const options = {
headers: {
'X-RocketChat-Livechat-Token': RocketChat.settings.get('Livechat_secret_token')
},
data: sampleData
};
let response = postCatchError(RocketChat.settings.get('Livechat_webhookUrl'), options);
const response = postCatchError(RocketChat.settings.get('Livechat_webhookUrl'), options);
console.log('response ->', response);

@ -98,7 +98,7 @@ class LivechatDepartmentAgents extends RocketChat.models._Base {
}
findUsersInQueue(usersList) {
let query = {};
const query = {};
if (!_.isEmpty(usersList)) {
query.username = {
@ -106,7 +106,7 @@ class LivechatDepartmentAgents extends RocketChat.models._Base {
};
}
let options = {
const options = {
sort: {
departmentId: 1,
count: 1,

@ -42,7 +42,7 @@ RocketChat.models.Rooms.findLivechat = function(filter = {}, offset = 0, limit =
RocketChat.models.Rooms.findLivechatByCode = function(code, fields) {
code = parseInt(code);
let options = {};
const options = {};
if (fields) {
options.fields = fields;

@ -133,11 +133,11 @@ RocketChat.models.Users.findVisitorByToken = function(token) {
* @param {string} token - Visitor token
*/
RocketChat.models.Users.setLivechatStatus = function(userId, status) {
let query = {
const query = {
'_id': userId
};
let update = {
const update = {
$set: {
'statusLivechat': status
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save