From 3abceabc4e50f9b1e3e38993d5699dcb0aa2ff3c Mon Sep 17 00:00:00 2001 From: Pierre Date: Mon, 17 Sep 2018 12:48:36 -0300 Subject: [PATCH 1/5] Reduced code complexity and added data validation --- .../server/importer.js | 434 ++++++++++-------- .../rocketchat-lib/server/models/Messages.js | 2 +- 2 files changed, 232 insertions(+), 204 deletions(-) diff --git a/packages/rocketchat-importer-slack/server/importer.js b/packages/rocketchat-importer-slack/server/importer.js index f76647eb00d5..116229fc4017 100644 --- a/packages/rocketchat-importer-slack/server/importer.js +++ b/packages/rocketchat-importer-slack/server/importer.js @@ -121,6 +121,230 @@ export class SlackImporter extends Base { return new Selection(this.name, selectionUsers, selectionChannels, selectionMessages); } + performUserImport(user, startedByUserId) { + if (!user.do_import) { + return; + } + + Meteor.runAsUser(startedByUserId, () => { + const existantUser = RocketChat.models.Users.findOneByEmailAddress(user.profile.email) || RocketChat.models.Users.findOneByUsername(user.name); + if (existantUser) { + user.rocketId = existantUser._id; + RocketChat.models.Users.update({ _id: user.rocketId }, { $addToSet: { importIds: user.id } }); + this.userTags.push({ + slack: `<@${ user.id }>`, + slackLong: `<@${ user.id }|${ user.name }>`, + rocket: `@${ existantUser.username }`, + }); + } else { + const userId = user.profile.email ? Accounts.createUser({ email: user.profile.email, password: Date.now() + user.name + user.profile.email.toUpperCase() }) : Accounts.createUser({ username: user.name, password: Date.now() + user.name, joinDefaultChannelsSilenced: true }); + Meteor.runAsUser(userId, () => { + Meteor.call('setUsername', user.name, { joinDefaultChannelsSilenced: true }); + + const url = user.profile.image_original || user.profile.image_512; + try { + Meteor.call('setAvatarFromService', url, undefined, 'url'); + } catch (error) { + this.logger.warn(`Failed to set ${ user.name }'s avatar from url ${ url }`); + console.log(`Failed to set ${ user.name }'s avatar from url ${ url }`); + } + + // Slack's is -18000 which translates to Rocket.Chat's after dividing by 3600 + if (user.tz_offset) { + Meteor.call('userSetUtcOffset', user.tz_offset / 3600); + } + }); + + RocketChat.models.Users.update({ _id: userId }, { $addToSet: { importIds: user.id } }); + + if (user.profile.real_name) { + RocketChat.models.Users.setName(userId, user.profile.real_name); + } + + // Deleted users are 'inactive' users in Rocket.Chat + if (user.deleted) { + Meteor.call('setUserActiveStatus', userId, false); + } + + user.rocketId = userId; + this.userTags.push({ + slack: `<@${ user.id }>`, + slackLong: `<@${ user.id }|${ user.name }>`, + rocket: `@${ user.name }`, + }); + } + + this.addCountCompleted(1); + }); + } + + processMessageSubType(message, room, msgDataDefaults, missedTypes) { + let msgObj; + const ignoreTypes = { bot_add: true, file_comment: true, file_mention: true }; + + let rocketUser = this.getRocketUser(message.user); + if (!rocketUser) { + rocketUser = RocketChat.models.Users.findOneById('rocket.cat', { fields: { username: 1, name: 1 } }); + } + + if (rocketUser) { + switch (message.subtype) { + case 'channel_join': + RocketChat.models.Messages.createUserJoinWithRoomIdAndUser(room._id, rocketUser, msgDataDefaults); + break; + case 'channel_leave': + RocketChat.models.Messages.createUserLeaveWithRoomIdAndUser(room._id, rocketUser, msgDataDefaults); + break; + case 'me_message': + msgObj = { + ...msgDataDefaults, + msg: `_${ this.convertSlackMessageToRocketChat(message.text) }_`, + }; + RocketChat.sendMessage(rocketUser, msgObj, room, true); + break; + case 'bot_message': + case 'slackbot_response': + const botUser = RocketChat.models.Users.findOneById('rocket.cat', { fields: { username: 1 } }); + const botUsername = this.bots[message.bot_id] ? this.bots[message.bot_id].name : message.username; + msgObj = { + ...msgDataDefaults, + msg: this.convertSlackMessageToRocketChat(message.text), + rid: room._id, + bot: true, + attachments: message.attachments, + username: botUsername || undefined, + }; + + if (message.edited) { + msgObj.editedAt = new Date(parseInt(message.edited.ts.split('.')[0]) * 1000); + const editedBy = this.getRocketUser(message.edited.user); + if (editedBy) { + msgObj.editedBy = { + _id: editedBy._id, + username: editedBy.username, + }; + } + } + + if (message.icons) { + msgObj.emoji = message.icons.emoji; + } + RocketChat.sendMessage(botUser, msgObj, room, true); + break; + case 'channel_purpose': + RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser('room_changed_description', room._id, message.purpose, rocketUser, msgDataDefaults); + break; + case 'channel_topic': + RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser('room_changed_topic', room._id, message.topic, rocketUser, msgDataDefaults); + break; + case 'channel_name': + RocketChat.models.Messages.createRoomRenamedWithRoomIdRoomNameAndUser(room._id, message.name, rocketUser, msgDataDefaults); + break; + case 'pinned_item': + if (message.attachments) { + const msgObj = { + ...msgDataDefaults, + attachments: [{ + text: this.convertSlackMessageToRocketChat(message.attachments[0].text), + author_name : message.attachments[0].author_subname, + author_icon : getAvatarUrlFromUsername(message.attachments[0].author_subname), + }], + }; + + RocketChat.models.Messages.createWithTypeRoomIdMessageAndUser('message_pinned', room._id, '', rocketUser, msgObj); + } else { + // TODO: make this better + this.logger.debug('Pinned item with no attachment, needs work.'); + // RocketChat.models.Messages.createWithTypeRoomIdMessageAndUser 'message_pinned', room._id, '', @getRocketUser(message.user), msgDataDefaults + } + break; + case 'file_share': + if (message.file && message.file.url_private_download !== undefined) { + const details = { + message_id: `slack-${ message.ts.replace(/\./g, '-') }`, + name: message.file.name, + size: message.file.size, + type: message.file.mimetype, + rid: room._id, + }; + this.uploadFile(details, message.file.url_private_download, rocketUser, room, new Date(parseInt(message.ts.split('.')[0]) * 1000)); + } + break; + default: + if (!missedTypes[message.subtype] && !ignoreTypes[message.subtype]) { + missedTypes[message.subtype] = message; + } + break; + } + } + } + + performMessageImport(message, room, missedTypes, slackChannel) { + const msgDataDefaults = { + _id: `slack-${ slackChannel.id }-${ message.ts.replace(/\./g, '-') }`, + ts: new Date(parseInt(message.ts.split('.')[0]) * 1000), + }; + + // Process the reactions + if (message.reactions && message.reactions.length > 0) { + msgDataDefaults.reactions = {}; + + message.reactions.forEach((reaction) => { + reaction.name = `:${ reaction.name }:`; + msgDataDefaults.reactions[reaction.name] = { usernames: [] }; + + reaction.users.forEach((u) => { + const rcUser = this.getRocketUser(u); + if (!rcUser) { return; } + + msgDataDefaults.reactions[reaction.name].usernames.push(rcUser.username); + }); + + if (msgDataDefaults.reactions[reaction.name].usernames.length === 0) { + delete msgDataDefaults.reactions[reaction.name]; + } + }); + } + + if (message.type === 'message') { + if (message.subtype) { + this.processMessageSubType(message, room, msgDataDefaults, missedTypes); + } else { + const user = this.getRocketUser(message.user); + if (user) { + const msgObj = { + ...msgDataDefaults, + msg: this.convertSlackMessageToRocketChat(message.text), + rid: room._id, + u: { + _id: user._id, + username: user.username, + }, + }; + + if (message.edited) { + msgObj.editedAt = new Date(parseInt(message.edited.ts.split('.')[0]) * 1000); + const editedBy = this.getRocketUser(message.edited.user); + if (editedBy) { + msgObj.editedBy = { + _id: editedBy._id, + username: editedBy.username, + }; + } + } + + try { + RocketChat.sendMessage(this.getRocketUser(message.user), msgObj, room, true); + } catch (e) { + this.logger.warn(`Failed to import the message: ${ msgDataDefaults._id }`); + } + } + } + } + + this.addCountCompleted(1); + } + startImport(importSelection) { super.startImport(importSelection); const start = Date.now(); @@ -151,62 +375,7 @@ export class SlackImporter extends Base { Meteor.defer(() => { try { super.updateProgress(ProgressStep.IMPORTING_USERS); - this.users.users.forEach((user) => { - if (!user.do_import) { - return; - } - - Meteor.runAsUser(startedByUserId, () => { - const existantUser = RocketChat.models.Users.findOneByEmailAddress(user.profile.email) || RocketChat.models.Users.findOneByUsername(user.name); - if (existantUser) { - user.rocketId = existantUser._id; - RocketChat.models.Users.update({ _id: user.rocketId }, { $addToSet: { importIds: user.id } }); - this.userTags.push({ - slack: `<@${ user.id }>`, - slackLong: `<@${ user.id }|${ user.name }>`, - rocket: `@${ existantUser.username }`, - }); - } else { - const userId = user.profile.email ? Accounts.createUser({ email: user.profile.email, password: Date.now() + user.name + user.profile.email.toUpperCase() }) : Accounts.createUser({ username: user.name, password: Date.now() + user.name, joinDefaultChannelsSilenced: true }); - Meteor.runAsUser(userId, () => { - Meteor.call('setUsername', user.name, { joinDefaultChannelsSilenced: true }); - - const url = user.profile.image_original || user.profile.image_512; - try { - Meteor.call('setAvatarFromService', url, undefined, 'url'); - } catch (error) { - this.logger.warn(`Failed to set ${ user.name }'s avatar from url ${ url }`); - console.log(`Failed to set ${ user.name }'s avatar from url ${ url }`); - } - - // Slack's is -18000 which translates to Rocket.Chat's after dividing by 3600 - if (user.tz_offset) { - Meteor.call('userSetUtcOffset', user.tz_offset / 3600); - } - }); - - RocketChat.models.Users.update({ _id: userId }, { $addToSet: { importIds: user.id } }); - - if (user.profile.real_name) { - RocketChat.models.Users.setName(userId, user.profile.real_name); - } - - // Deleted users are 'inactive' users in Rocket.Chat - if (user.deleted) { - Meteor.call('setUserActiveStatus', userId, false); - } - - user.rocketId = userId; - this.userTags.push({ - slack: `<@${ user.id }>`, - slackLong: `<@${ user.id }|${ user.name }>`, - rocket: `@${ user.name }`, - }); - } - - this.addCountCompleted(1); - }); - }); + this.users.users.forEach((user) => this.performUserImport(user, startedByUserId)); this.collection.update({ _id: this.users._id }, { $set: { users: this.users.users } }); super.updateProgress(ProgressStep.IMPORTING_CHANNELS); @@ -264,164 +433,23 @@ export class SlackImporter extends Base { this.collection.update({ _id: this.channels._id }, { $set: { channels: this.channels.channels } }); const missedTypes = {}; - const ignoreTypes = { bot_add: true, file_comment: true, file_mention: true }; + super.updateProgress(ProgressStep.IMPORTING_MESSAGES); Object.keys(this.messages).forEach((channel) => { const messagesObj = this.messages[channel]; Meteor.runAsUser(startedByUserId, () => { const slackChannel = this.getSlackChannelFromName(channel); - if (!slackChannel || !slackChannel.do_import) { return; } + if (!slackChannel || !slackChannel.do_import) { + return; + } + const room = RocketChat.models.Rooms.findOneById(slackChannel.rocketId, { fields: { usernames: 1, t: 1, name: 1 } }); Object.keys(messagesObj).forEach((date) => { const msgs = messagesObj[date]; msgs.messages.forEach((message) => { this.updateRecord({ messagesstatus: `${ channel }/${ date }.${ msgs.messages.length }` }); - const msgDataDefaults = { - _id: `slack-${ slackChannel.id }-${ message.ts.replace(/\./g, '-') }`, - ts: new Date(parseInt(message.ts.split('.')[0]) * 1000), - }; - - // Process the reactions - if (message.reactions && message.reactions.length > 0) { - msgDataDefaults.reactions = {}; - - message.reactions.forEach((reaction) => { - reaction.name = `:${ reaction.name }:`; - msgDataDefaults.reactions[reaction.name] = { usernames: [] }; - - reaction.users.forEach((u) => { - const rcUser = this.getRocketUser(u); - if (!rcUser) { return; } - - msgDataDefaults.reactions[reaction.name].usernames.push(rcUser.username); - }); - - if (msgDataDefaults.reactions[reaction.name].usernames.length === 0) { - delete msgDataDefaults.reactions[reaction.name]; - } - }); - } - - if (message.type === 'message') { - if (message.subtype) { - if (message.subtype === 'channel_join') { - if (this.getRocketUser(message.user)) { - RocketChat.models.Messages.createUserJoinWithRoomIdAndUser(room._id, this.getRocketUser(message.user), msgDataDefaults); - } - } else if (message.subtype === 'channel_leave') { - if (this.getRocketUser(message.user)) { - RocketChat.models.Messages.createUserLeaveWithRoomIdAndUser(room._id, this.getRocketUser(message.user), msgDataDefaults); - } - } else if (message.subtype === 'me_message') { - const msgObj = { - ...msgDataDefaults, - msg: `_${ this.convertSlackMessageToRocketChat(message.text) }_`, - }; - RocketChat.sendMessage(this.getRocketUser(message.user), msgObj, room, true); - } else if (message.subtype === 'bot_message' || message.subtype === 'slackbot_response') { - const botUser = RocketChat.models.Users.findOneById('rocket.cat', { fields: { username: 1 } }); - const botUsername = this.bots[message.bot_id] ? this.bots[message.bot_id].name : message.username; - const msgObj = { - ...msgDataDefaults, - msg: this.convertSlackMessageToRocketChat(message.text), - rid: room._id, - bot: true, - attachments: message.attachments, - username: botUsername || undefined, - }; - - if (message.edited) { - msgObj.editedAt = new Date(parseInt(message.edited.ts.split('.')[0]) * 1000); - const editedBy = this.getRocketUser(message.edited.user); - if (editedBy) { - msgObj.editedBy = { - _id: editedBy._id, - username: editedBy.username, - }; - } - } - - if (message.icons) { - msgObj.emoji = message.icons.emoji; - } - RocketChat.sendMessage(botUser, msgObj, room, true); - } else if (message.subtype === 'channel_purpose') { - if (this.getRocketUser(message.user)) { - RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser('room_changed_description', room._id, message.purpose, this.getRocketUser(message.user), msgDataDefaults); - } - } else if (message.subtype === 'channel_topic') { - if (this.getRocketUser(message.user)) { - RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser('room_changed_topic', room._id, message.topic, this.getRocketUser(message.user), msgDataDefaults); - } - } else if (message.subtype === 'channel_name') { - if (this.getRocketUser(message.user)) { - RocketChat.models.Messages.createRoomRenamedWithRoomIdRoomNameAndUser(room._id, message.name, this.getRocketUser(message.user), msgDataDefaults); - } - } else if (message.subtype === 'pinned_item') { - if (message.attachments) { - const msgObj = { - ...msgDataDefaults, - attachments: [{ - text: this.convertSlackMessageToRocketChat(message.attachments[0].text), - author_name : message.attachments[0].author_subname, - author_icon : getAvatarUrlFromUsername(message.attachments[0].author_subname), - }], - }; - RocketChat.models.Messages.createWithTypeRoomIdMessageAndUser('message_pinned', room._id, '', this.getRocketUser(message.user), msgObj); - } else { - // TODO: make this better - this.logger.debug('Pinned item with no attachment, needs work.'); - // RocketChat.models.Messages.createWithTypeRoomIdMessageAndUser 'message_pinned', room._id, '', @getRocketUser(message.user), msgDataDefaults - } - } else if (message.subtype === 'file_share') { - if (message.file && message.file.url_private_download !== undefined) { - const details = { - message_id: `slack-${ message.ts.replace(/\./g, '-') }`, - name: message.file.name, - size: message.file.size, - type: message.file.mimetype, - rid: room._id, - }; - this.uploadFile(details, message.file.url_private_download, this.getRocketUser(message.user), room, new Date(parseInt(message.ts.split('.')[0]) * 1000)); - } - } else if (!missedTypes[message.subtype] && !ignoreTypes[message.subtype]) { - missedTypes[message.subtype] = message; - } - } else { - const user = this.getRocketUser(message.user); - if (user) { - const msgObj = { - ...msgDataDefaults, - msg: this.convertSlackMessageToRocketChat(message.text), - rid: room._id, - u: { - _id: user._id, - username: user.username, - }, - }; - - if (message.edited) { - msgObj.editedAt = new Date(parseInt(message.edited.ts.split('.')[0]) * 1000); - const editedBy = this.getRocketUser(message.edited.user); - if (editedBy) { - msgObj.editedBy = { - _id: editedBy._id, - username: editedBy.username, - }; - } - } - - try { - RocketChat.sendMessage(this.getRocketUser(message.user), msgObj, room, true); - } catch (e) { - this.logger.warn(`Failed to import the message: ${ msgDataDefaults._id }`); - } - } - } - } - - this.addCountCompleted(1); + return this.performMessageImport(message, room, missedTypes, slackChannel); }); }); }); diff --git a/packages/rocketchat-lib/server/models/Messages.js b/packages/rocketchat-lib/server/models/Messages.js index fd25dbd8d492..0a90550fd07b 100644 --- a/packages/rocketchat-lib/server/models/Messages.js +++ b/packages/rocketchat-lib/server/models/Messages.js @@ -601,7 +601,7 @@ RocketChat.models.Messages = new class extends RocketChat.models._Base { _.extend(record, extraData); record._id = this.insertOrUpsert(record); - RocketChat.models.Rooms.incMsgCountById(room._id, 1); + RocketChat.models.Rooms.incMsgCountById(roomId, 1); return record; } From 9651ef146af8a2580e8b2e7a07198965bb11105a Mon Sep 17 00:00:00 2001 From: Hudell Date: Mon, 3 Dec 2018 15:03:40 -0200 Subject: [PATCH 2/5] Improved code quality --- .../server/importer.js | 174 +++++++++--------- 1 file changed, 89 insertions(+), 85 deletions(-) diff --git a/packages/rocketchat-importer-slack/server/importer.js b/packages/rocketchat-importer-slack/server/importer.js index 2a45b6f92b2e..5f14a5c4025f 100644 --- a/packages/rocketchat-importer-slack/server/importer.js +++ b/packages/rocketchat-importer-slack/server/importer.js @@ -184,7 +184,6 @@ export class SlackImporter extends Base { } processMessageSubType(message, room, msgDataDefaults, missedTypes) { - let msgObj; const ignoreTypes = { bot_add: true, file_comment: true, file_mention: true }; let rocketUser = this.getRocketUser(message.user); @@ -192,95 +191,100 @@ export class SlackImporter extends Base { rocketUser = RocketChat.models.Users.findOneById('rocket.cat', { fields: { username: 1, name: 1 } }); } - if (rocketUser) { - switch (message.subtype) { - case 'channel_join': - RocketChat.models.Messages.createUserJoinWithRoomIdAndUser(room._id, rocketUser, msgDataDefaults); - break; - case 'channel_leave': - RocketChat.models.Messages.createUserLeaveWithRoomIdAndUser(room._id, rocketUser, msgDataDefaults); - break; - case 'me_message': - msgObj = { - ...msgDataDefaults, - msg: `_${ this.convertSlackMessageToRocketChat(message.text) }_`, - }; - RocketChat.sendMessage(rocketUser, msgObj, room, true); - break; - case 'bot_message': - case 'slackbot_response': - const botUser = RocketChat.models.Users.findOneById('rocket.cat', { fields: { username: 1 } }); - const botUsername = this.bots[message.bot_id] ? this.bots[message.bot_id].name : message.username; - msgObj = { - ...msgDataDefaults, - msg: this.convertSlackMessageToRocketChat(message.text), - rid: room._id, - bot: true, - attachments: message.attachments, - username: botUsername || undefined, - }; - - if (message.edited) { - msgObj.editedAt = new Date(parseInt(message.edited.ts.split('.')[0]) * 1000); - const editedBy = this.getRocketUser(message.edited.user); - if (editedBy) { - msgObj.editedBy = { - _id: editedBy._id, - username: editedBy.username, - }; - } - } + if (!rocketUser) { + return; + } - if (message.icons) { - msgObj.emoji = message.icons.emoji; - } - RocketChat.sendMessage(botUser, msgObj, room, true); - break; - case 'channel_purpose': - RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser('room_changed_description', room._id, message.purpose, rocketUser, msgDataDefaults); - break; - case 'channel_topic': - RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser('room_changed_topic', room._id, message.topic, rocketUser, msgDataDefaults); - break; - case 'channel_name': - RocketChat.models.Messages.createRoomRenamedWithRoomIdRoomNameAndUser(room._id, message.name, rocketUser, msgDataDefaults); - break; - case 'pinned_item': - if (message.attachments) { - const msgObj = { - ...msgDataDefaults, - attachments: [{ - text: this.convertSlackMessageToRocketChat(message.attachments[0].text), - author_name : message.attachments[0].author_subname, - author_icon : getAvatarUrlFromUsername(message.attachments[0].author_subname), - }], - }; + switch (message.subtype) { + case 'channel_join': + RocketChat.models.Messages.createUserJoinWithRoomIdAndUser(room._id, rocketUser, msgDataDefaults); + break; + case 'channel_leave': + RocketChat.models.Messages.createUserLeaveWithRoomIdAndUser(room._id, rocketUser, msgDataDefaults); + break; + case 'me_message': { + const msgObj = { + ...msgDataDefaults, + msg: `_${ this.convertSlackMessageToRocketChat(message.text) }_`, + }; + RocketChat.sendMessage(rocketUser, msgObj, room, true); + break; + } + case 'bot_message': + case 'slackbot_response': { + const botUser = RocketChat.models.Users.findOneById('rocket.cat', { fields: { username: 1 } }); + const botUsername = this.bots[message.bot_id] ? this.bots[message.bot_id].name : message.username; + const msgObj = { + ...msgDataDefaults, + msg: this.convertSlackMessageToRocketChat(message.text), + rid: room._id, + bot: true, + attachments: message.attachments, + username: botUsername || undefined, + }; - RocketChat.models.Messages.createWithTypeRoomIdMessageAndUser('message_pinned', room._id, '', rocketUser, msgObj); - } else { - // TODO: make this better - this.logger.debug('Pinned item with no attachment, needs work.'); - // RocketChat.models.Messages.createWithTypeRoomIdMessageAndUser 'message_pinned', room._id, '', @getRocketUser(message.user), msgDataDefaults - } - break; - case 'file_share': - if (message.file && message.file.url_private_download !== undefined) { - const details = { - message_id: `slack-${ message.ts.replace(/\./g, '-') }`, - name: message.file.name, - size: message.file.size, - type: message.file.mimetype, - rid: room._id, + if (message.edited) { + msgObj.editedAt = new Date(parseInt(message.edited.ts.split('.')[0]) * 1000); + const editedBy = this.getRocketUser(message.edited.user); + if (editedBy) { + msgObj.editedBy = { + _id: editedBy._id, + username: editedBy.username, }; - this.uploadFile(details, message.file.url_private_download, rocketUser, room, new Date(parseInt(message.ts.split('.')[0]) * 1000)); - } - break; - default: - if (!missedTypes[message.subtype] && !ignoreTypes[message.subtype]) { - missedTypes[message.subtype] = message; } - break; + } + + if (message.icons) { + msgObj.emoji = message.icons.emoji; + } + RocketChat.sendMessage(botUser, msgObj, room, true); + break; } + + case 'channel_purpose': + RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser('room_changed_description', room._id, message.purpose, rocketUser, msgDataDefaults); + break; + case 'channel_topic': + RocketChat.models.Messages.createRoomSettingsChangedWithTypeRoomIdMessageAndUser('room_changed_topic', room._id, message.topic, rocketUser, msgDataDefaults); + break; + case 'channel_name': + RocketChat.models.Messages.createRoomRenamedWithRoomIdRoomNameAndUser(room._id, message.name, rocketUser, msgDataDefaults); + break; + case 'pinned_item': + if (message.attachments) { + const msgObj = { + ...msgDataDefaults, + attachments: [{ + text: this.convertSlackMessageToRocketChat(message.attachments[0].text), + author_name : message.attachments[0].author_subname, + author_icon : getAvatarUrlFromUsername(message.attachments[0].author_subname), + }], + }; + + RocketChat.models.Messages.createWithTypeRoomIdMessageAndUser('message_pinned', room._id, '', rocketUser, msgObj); + } else { + // TODO: make this better + this.logger.debug('Pinned item with no attachment, needs work.'); + // RocketChat.models.Messages.createWithTypeRoomIdMessageAndUser 'message_pinned', room._id, '', @getRocketUser(message.user), msgDataDefaults + } + break; + case 'file_share': + if (message.file && message.file.url_private_download !== undefined) { + const details = { + message_id: `slack-${ message.ts.replace(/\./g, '-') }`, + name: message.file.name, + size: message.file.size, + type: message.file.mimetype, + rid: room._id, + }; + this.uploadFile(details, message.file.url_private_download, rocketUser, room, new Date(parseInt(message.ts.split('.')[0]) * 1000)); + } + break; + default: + if (!missedTypes[message.subtype] && !ignoreTypes[message.subtype]) { + missedTypes[message.subtype] = message; + } + break; } } From c9ed9249b7ba4d351022ea2bf81c9df768bf9170 Mon Sep 17 00:00:00 2001 From: Hudell Date: Mon, 3 Dec 2018 17:58:24 -0200 Subject: [PATCH 3/5] Fix file import --- .../server/importer.js | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/rocketchat-importer-slack/server/importer.js b/packages/rocketchat-importer-slack/server/importer.js index 5f14a5c4025f..2e27a1fb1f2a 100644 --- a/packages/rocketchat-importer-slack/server/importer.js +++ b/packages/rocketchat-importer-slack/server/importer.js @@ -316,12 +316,22 @@ export class SlackImporter extends Base { } if (message.type === 'message') { - if (message.files && message.files[0].url_private_download !== undefined) { - const msgObj = { - ...msgDataDefaults, - msg: this.convertSlackMessageToRocketChat(message.files[0].url_private_download), - }; - RocketChat.sendMessage(this.getRocketUser(message.user), msgObj, room, true); + if (message.files) { + const fileUser = this.getRocketUser(message.user); + let fileIndex = 0; + + message.files.forEach((file) => { + fileIndex++; + if (file.url_private_download === undefined) { + return; + } + const msgObj = { + _id: `slack-${ slackChannel.id }-${ message.ts.replace(/\./g, '-') }-file${ fileIndex }`, + ts: msgDataDefaults.ts, + msg: file.url_private_download, + }; + RocketChat.sendMessage(fileUser, msgObj, room, true); + }); } if (message.subtype) { From e4f347686b288e5d9256f660a1d18d5f6e2e5621 Mon Sep 17 00:00:00 2001 From: Hudell Date: Mon, 3 Dec 2018 18:12:57 -0200 Subject: [PATCH 4/5] Skip user join and user leave messages when the user is not imported --- .../rocketchat-importer-slack/server/importer.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/rocketchat-importer-slack/server/importer.js b/packages/rocketchat-importer-slack/server/importer.js index 2e27a1fb1f2a..e4e2b45ac888 100644 --- a/packages/rocketchat-importer-slack/server/importer.js +++ b/packages/rocketchat-importer-slack/server/importer.js @@ -187,7 +187,9 @@ export class SlackImporter extends Base { const ignoreTypes = { bot_add: true, file_comment: true, file_mention: true }; let rocketUser = this.getRocketUser(message.user); - if (!rocketUser) { + const useRocketCat = !rocketUser; + + if (useRocketCat) { rocketUser = RocketChat.models.Users.findOneById('rocket.cat', { fields: { username: 1, name: 1 } }); } @@ -197,10 +199,14 @@ export class SlackImporter extends Base { switch (message.subtype) { case 'channel_join': - RocketChat.models.Messages.createUserJoinWithRoomIdAndUser(room._id, rocketUser, msgDataDefaults); + if (!useRocketCat) { + RocketChat.models.Messages.createUserJoinWithRoomIdAndUser(room._id, rocketUser, msgDataDefaults); + } break; case 'channel_leave': - RocketChat.models.Messages.createUserLeaveWithRoomIdAndUser(room._id, rocketUser, msgDataDefaults); + if (!useRocketCat) { + RocketChat.models.Messages.createUserLeaveWithRoomIdAndUser(room._id, rocketUser, msgDataDefaults); + } break; case 'me_message': { const msgObj = { From cda02cc04bbd77da8a4077cfddc7421e0a083049 Mon Sep 17 00:00:00 2001 From: Pierre Lehnen Date: Wed, 15 May 2019 11:43:51 -0300 Subject: [PATCH 5/5] Fixing code for new eslint rules --- app/importer-slack/server/importer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/importer-slack/server/importer.js b/app/importer-slack/server/importer.js index daade927d117..08fc7e913ec8 100644 --- a/app/importer-slack/server/importer.js +++ b/app/importer-slack/server/importer.js @@ -264,8 +264,8 @@ export class SlackImporter extends Base { ...msgDataDefaults, attachments: [{ text: this.convertSlackMessageToRocketChat(message.attachments[0].text), - author_name : message.attachments[0].author_subname, - author_icon : getUserAvatarURL(message.attachments[0].author_subname), + author_name: message.attachments[0].author_subname, + author_icon: getUserAvatarURL(message.attachments[0].author_subname), }], };