fix: Update Slack integration to fix message delivery issues (#6093)

This commit is contained in:
Pranav Raj S 2022-12-17 16:41:11 -08:00 committed by GitHub
parent 4d2b7c37a0
commit 38587b3aa1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 52 additions and 9 deletions

View file

@ -22,13 +22,23 @@ class Integrations::Slack::IncomingMessageBuilder
private private
def valid_event? def valid_event?
supported_event_type? && supported_event? supported_event_type? && supported_event? && should_process_event?
end end
def supported_event_type? def supported_event_type?
SUPPORTED_EVENT_TYPES.include?(params[:type]) SUPPORTED_EVENT_TYPES.include?(params[:type])
end end
# Discard all the subtype of a message event
# We are only considering the actual message sent by a Slack user
# Any reactions or messages sent by the bot will be ignored.
# https://api.slack.com/events/message#subtypes
def should_process_event?
return true if params[:type] != 'event_callback'
params[:event][:user].present? && params[:event][:subtype].blank?
end
def supported_event? def supported_event?
hook_verification? || SUPPORTED_EVENTS.include?(params[:event][:type]) hook_verification? || SUPPORTED_EVENTS.include?(params[:event][:type])
end end

View file

@ -36,12 +36,13 @@ class Integrations::Slack::SendOnSlackService < Base::SendOnChannelService
if conversation.identifier.present? if conversation.identifier.present?
"#{private_indicator}#{message.content}" "#{private_indicator}#{message.content}"
else else
"*Inbox: #{message.inbox.name} [#{message.inbox.inbox_type}]* \n\n #{message.content}" "\n*Inbox:* #{message.inbox.name} (#{message.inbox.inbox_type})\n\n#{message.content}"
end end
end end
def avatar_url(sender) def avatar_url(sender)
sender.try(:avatar_url) || "#{ENV.fetch('FRONTEND_URL', nil)}/admin/avatar_square.png" sender_type = sender.instance_of?(Contact) ? 'contact' : 'user'
"#{ENV.fetch('FRONTEND_URL', nil)}/integrations/slack/#{sender_type}.png"
end end
def send_message def send_message
@ -86,7 +87,7 @@ class Integrations::Slack::SendOnSlackService < Base::SendOnChannelService
end end
def sender_name(sender) def sender_name(sender)
sender.try(:name) ? "#{sender_type(sender)}: #{sender.try(:name)}" : sender_type(sender) sender.try(:name) ? "#{sender.try(:name)} (#{sender_type(sender)})" : sender_type(sender)
end end
def sender_type(sender) def sender_type(sender)

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -12,6 +12,24 @@ describe Integrations::Slack::IncomingMessageBuilder do
event_time: 1_588_623_033 event_time: 1_588_623_033
} }
end end
let(:sub_type_message) do
{
team_id: 'TLST3048H',
api_app_id: 'A012S5UETV4',
event: message_event.merge({ type: 'message', subtype: 'bot_message' }),
type: 'event_callback',
event_time: 1_588_623_033
}
end
let(:message_without_user) do
{
team_id: 'TLST3048H',
api_app_id: 'A012S5UETV4',
event: message_event.merge({ type: 'message', user: nil }),
type: 'event_callback',
event_time: 1_588_623_033
}
end
let(:message_with_attachments) { slack_attachment_stub } let(:message_with_attachments) { slack_attachment_stub }
let(:message_without_thread_ts) { slack_message_stub_without_thread_ts } let(:message_without_thread_ts) { slack_message_stub_without_thread_ts }
let(:verification_params) { slack_url_verification_stub } let(:verification_params) { slack_url_verification_stub }
@ -81,6 +99,20 @@ describe Integrations::Slack::IncomingMessageBuilder do
expect(conversation.messages.count).to eql(messages_count) expect(conversation.messages.count).to eql(messages_count)
end end
it 'does not create message for message sub type events' do
messages_count = conversation.messages.count
builder = described_class.new(sub_type_message)
builder.perform
expect(conversation.messages.count).to eql(messages_count)
end
it 'does not create message if user is missing' do
messages_count = conversation.messages.count
builder = described_class.new(message_without_user)
builder.perform
expect(conversation.messages.count).to eql(messages_count)
end
it 'does not create message for invalid event type and event files is not present' do it 'does not create message for invalid event type and event files is not present' do
messages_count = conversation.messages.count messages_count = conversation.messages.count
message_with_attachments[:event][:files] = nil message_with_attachments[:event][:files] = nil

View file

@ -28,8 +28,8 @@ describe Integrations::Slack::SendOnSlackService do
expect(slack_client).to receive(:chat_postMessage).with( expect(slack_client).to receive(:chat_postMessage).with(
channel: hook.reference_id, channel: hook.reference_id,
text: "*Inbox: #{inbox.name} [#{inbox.inbox_type}]* \n\n #{message.content}", text: "\n*Inbox:* #{inbox.name} (#{inbox.inbox_type})\n\n#{message.content}",
username: "Contact: #{message.sender.name}", username: "#{message.sender.name} (Contact)",
thread_ts: nil, thread_ts: nil,
icon_url: anything icon_url: anything
).and_return(slack_message) ).and_return(slack_message)
@ -49,7 +49,7 @@ describe Integrations::Slack::SendOnSlackService do
expect(slack_client).to receive(:chat_postMessage).with( expect(slack_client).to receive(:chat_postMessage).with(
channel: hook.reference_id, channel: hook.reference_id,
text: message.content, text: message.content,
username: "Contact: #{message.sender.name}", username: "#{message.sender.name} (Contact)",
thread_ts: conversation.identifier, thread_ts: conversation.identifier,
icon_url: anything icon_url: anything
).and_return(slack_message) ).and_return(slack_message)
@ -63,7 +63,7 @@ describe Integrations::Slack::SendOnSlackService do
expect(slack_client).to receive(:chat_postMessage).with( expect(slack_client).to receive(:chat_postMessage).with(
channel: hook.reference_id, channel: hook.reference_id,
text: message.content, text: message.content,
username: "Contact: #{message.sender.name}", username: "#{message.sender.name} (Contact)",
thread_ts: conversation.identifier, thread_ts: conversation.identifier,
icon_url: anything icon_url: anything
).and_return(slack_message) ).and_return(slack_message)
@ -93,7 +93,7 @@ describe Integrations::Slack::SendOnSlackService do
expect(slack_client).to receive(:chat_postMessage).with( expect(slack_client).to receive(:chat_postMessage).with(
channel: hook.reference_id, channel: hook.reference_id,
text: message.content, text: message.content,
username: "Contact: #{message.sender.name}", username: "#{message.sender.name} (Contact)",
thread_ts: conversation.identifier, thread_ts: conversation.identifier,
icon_url: anything icon_url: anything
).and_raise(Slack::Web::Api::Errors::AccountInactive.new('Account disconnected')) ).and_raise(Slack::Web::Api::Errors::AccountInactive.new('Account disconnected'))