Skip to content

Commit

Permalink
fix: slackbridge was not receiving updates from Slack events anymore (#…
Browse files Browse the repository at this point in the history
…29592)

Co-authored-by: Diego Sampaio <chinello@gmail.com>
  • Loading branch information
MarcosSpessatto and sampaiodiego committed Aug 21, 2023
1 parent 4186eec commit 9e57180
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 26 deletions.
5 changes: 5 additions & 0 deletions .changeset/silly-actors-laugh.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@rocket.chat/meteor": patch
---

Fixed Slackbridge was not handling correctly received events from Slack anymore. Events: (Send, edit, delete, react meassages)
21 changes: 10 additions & 11 deletions apps/meteor/app/slackbridge/server/RocketAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -230,11 +230,11 @@ export default class RocketAdapter {
}

async getChannel(slackMessage) {
return slackMessage.channel ? this.findChannel(slackMessage.channel) || this.addChannel(slackMessage.channel) : null;
return slackMessage.channel ? (await this.findChannel(slackMessage.channel)) || this.addChannel(slackMessage.channel) : null;
}

async getUser(slackUser) {
return slackUser ? this.findUser(slackUser) || this.addUser(slackUser) : null;
return slackUser ? (await this.findUser(slackUser)) || this.addUser(slackUser) : null;
}

createRocketID(slackChannel, ts) {
Expand All @@ -259,7 +259,7 @@ export default class RocketAdapter {
}

async getRocketUserCreator(slackChannel) {
return slackChannel.creator ? this.findUser(slackChannel.creator) || this.addUser(slackChannel.creator) : null;
return slackChannel.creator ? (await this.findUser(slackChannel.creator)) || this.addUser(slackChannel.creator) : null;
}

async addChannel(slackChannelID, hasRetried = false) {
Expand All @@ -271,9 +271,9 @@ export default class RocketAdapter {
return;
}

const slackChannel = slack.slackAPI.getRoomInfo(slackChannelID);
const slackChannel = await slack.slackAPI.getRoomInfo(slackChannelID);
if (slackChannel) {
const members = slack.slackAPI.getMembers(slackChannelID);
const members = await slack.slackAPI.getMembers(slackChannelID);
if (!members) {
rocketLogger.error('Could not fetch room members');
return;
Expand All @@ -286,7 +286,7 @@ export default class RocketAdapter {
await Rooms.addImportIds(slackChannel.rocketId, slackChannel.id);
} else {
const rocketUsers = await this.getRocketUsers(members, slackChannel);
const rocketUserCreator = this.getRocketUserCreator(slackChannel);
const rocketUserCreator = await this.getRocketUserCreator(slackChannel);

if (!rocketUserCreator) {
rocketLogger.error({ msg: 'Could not fetch room creator information', creator: slackChannel.creator });
Expand All @@ -296,13 +296,13 @@ export default class RocketAdapter {
try {
const isPrivate = slackChannel.is_private;
const rocketChannel = await createRoom(isPrivate ? 'p' : 'c', slackChannel.name, rocketUserCreator.username, rocketUsers);
rocketChannel.rocketId = rocketChannel.rid;
slackChannel.rocketId = rocketChannel.rid;
} catch (e) {
if (!hasRetried) {
rocketLogger.debug('Error adding channel from Slack. Will retry in 1s.', e.message);
// If first time trying to create channel fails, could be because of multiple messages received at the same time. Try again once after 1s.
await sleep(1000);
return this.findChannel(slackChannelID) || this.addChannel(slackChannelID, true);
return (await this.findChannel(slackChannelID)) || this.addChannel(slackChannelID, true);
}
rocketLogger.error(e);
}
Expand All @@ -320,7 +320,6 @@ export default class RocketAdapter {
if (slackChannel.purpose && slackChannel.purpose.value && slackChannel.purpose.last_set > lastSetTopic) {
roomUpdate.topic = slackChannel.purpose.value;
}

await Rooms.addImportIds(slackChannel.rocketId, slackChannel.id);
slack.addSlackChannel(slackChannel.rocketId, slackChannelID);
}
Expand Down Expand Up @@ -354,7 +353,7 @@ export default class RocketAdapter {
return;
}

const user = slack.slackAPI.getUser(slackUserID);
const user = await slack.slackAPI.getUser(slackUserID);
if (user) {
const rocketUserData = user;
const isBot = rocketUserData.is_bot === true;
Expand Down Expand Up @@ -465,7 +464,7 @@ export default class RocketAdapter {
}
} else {
rocketMsgObj = {
msg: this.convertSlackMsgTxtToRocketTxtFormat(slackMessage.text),
msg: await this.convertSlackMsgTxtToRocketTxtFormat(slackMessage.text),
rid: rocketChannel._id,
u: {
_id: rocketUser._id,
Expand Down
16 changes: 8 additions & 8 deletions apps/meteor/app/slackbridge/server/SlackAPI.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export class SlackAPI {
types: 'public_channel',
exclude_archived: true,
limit: 1000,
cursor,
...(cursor && { cursor }),
},
});
const response = await request.json();
Expand All @@ -37,7 +37,7 @@ export class SlackAPI {
types: 'private_channel',
exclude_archived: true,
limit: 1000,
cursor,
...(cursor && { cursor }),
},
});
const response = await request.json();
Expand Down Expand Up @@ -77,7 +77,7 @@ export class SlackAPI {
token: this.apiToken,
channel: channelId,
limit: MAX_MEMBERS_PER_CALL,
cursor: currentCursor,
...(currentCursor && { cursor: currentCursor }),
},
});
// eslint-disable-next-line no-await-in-loop
Expand All @@ -96,7 +96,7 @@ export class SlackAPI {
async react(data) {
const request = await fetch('https://slack.com/api/reactions.add', {
method: 'POST',
body: data,
params: data,
});
const response = await request.json();
return response && request.status === 200 && response && request.ok;
Expand All @@ -105,7 +105,7 @@ export class SlackAPI {
async removeReaction(data) {
const request = await fetch('https://slack.com/api/reactions.remove', {
method: 'POST',
body: data,
params: data,
});
const response = await request.json();
return response && request.status === 200 && response && request.ok;
Expand All @@ -114,7 +114,7 @@ export class SlackAPI {
async removeMessage(data) {
const request = await fetch('https://slack.com/api/chat.delete', {
method: 'POST',
body: data,
params: data,
});
const response = await request.json();
return response && request.status === 200 && response && request.ok;
Expand All @@ -123,15 +123,15 @@ export class SlackAPI {
async sendMessage(data) {
const request = await fetch('https://slack.com/api/chat.postMessage', {
method: 'POST',
body: data,
params: data,
});
return request.json();
}

async updateMessage(data) {
const request = await fetch('https://slack.com/api/chat.update', {
method: 'POST',
body: data,
params: data,
});
const response = await request.json();
return response && request.status === 200 && response && request.ok;
Expand Down
13 changes: 7 additions & 6 deletions apps/meteor/app/slackbridge/server/SlackAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -362,14 +362,15 @@ export default class SlackAdapter {

if (rocketMsg && rocketUser) {
const rocketReaction = `:${slackReactionMsg.reaction}:`;
const theReaction = (rocketMsg.reactions || {})[rocketReaction];

// If the Rocket user has already been removed, then this is an echo back from slack
if (rocketMsg.reactions) {
const theReaction = rocketMsg.reactions[rocketReaction];
if (theReaction) {
if (theReaction.usernames.indexOf(rocketUser.username) === -1) {
return; // Reaction already removed
}
if (rocketMsg.reactions && theReaction) {
if (rocketUser.roles.includes('bot')) {
return;
}
if (theReaction.usernames.indexOf(rocketUser.username) === -1) {
return; // Reaction already removed
}
} else {
// Reaction already removed
Expand Down
2 changes: 1 addition & 1 deletion apps/meteor/server/models/raw/Rooms.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1450,7 +1450,7 @@ export class RoomsRaw extends BaseRaw<IRoom> implements IRoomsModel {
const update: UpdateFilter<IRoom> = {
$addToSet: {
importIds: {
$each: importIds,
$each: ([] as string[]).concat(importIds),
},
},
};
Expand Down

0 comments on commit 9e57180

Please sign in to comment.