mirror of
https://github.com/lingble/chatwoot.git
synced 2025-10-31 19:17:48 +00:00
Fix: Consider bot message on slack integration (#6793)
This commit is contained in:
@@ -18,6 +18,7 @@ class HookJob < ApplicationJob
|
|||||||
return unless ['message.created'].include?(event_name)
|
return unless ['message.created'].include?(event_name)
|
||||||
|
|
||||||
message = event_data[:message]
|
message = event_data[:message]
|
||||||
|
|
||||||
Integrations::Slack::SendOnSlackService.new(message: message, hook: hook).perform
|
Integrations::Slack::SendOnSlackService.new(message: message, hook: hook).perform
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
class HookListener < BaseListener
|
class HookListener < BaseListener
|
||||||
def message_created(event)
|
def message_created(event)
|
||||||
message = extract_message_and_account(event)[0]
|
message = extract_message_and_account(event)[0]
|
||||||
return unless message.webhook_sendable?
|
|
||||||
|
|
||||||
execute_hooks(event, message)
|
execute_hooks(event, message)
|
||||||
end
|
end
|
||||||
|
|
||||||
def message_updated(event)
|
def message_updated(event)
|
||||||
message = extract_message_and_account(event)[0]
|
message = extract_message_and_account(event)[0]
|
||||||
return unless message.webhook_sendable?
|
|
||||||
|
|
||||||
execute_hooks(event, message)
|
execute_hooks(event, message)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -9,6 +9,10 @@ module MessageFilterHelpers
|
|||||||
incoming? || outgoing?
|
incoming? || outgoing?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def slack_hook_sendable?
|
||||||
|
incoming? || outgoing? || template?
|
||||||
|
end
|
||||||
|
|
||||||
def notifiable?
|
def notifiable?
|
||||||
incoming? || outgoing?
|
incoming? || outgoing?
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ class Integrations::Slack::SendOnSlackService < Base::SendOnChannelService
|
|||||||
# we don't want message loop in slack
|
# we don't want message loop in slack
|
||||||
return if message.external_source_id_slack.present?
|
return if message.external_source_id_slack.present?
|
||||||
# we don't want to start slack thread from agent conversation as of now
|
# we don't want to start slack thread from agent conversation as of now
|
||||||
return if message.outgoing? && conversation.identifier.blank?
|
return if invalid_message?
|
||||||
|
|
||||||
perform_reply
|
perform_reply
|
||||||
end
|
end
|
||||||
@@ -23,6 +23,10 @@ class Integrations::Slack::SendOnSlackService < Base::SendOnChannelService
|
|||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def invalid_message?
|
||||||
|
(message.outgoing? && conversation.identifier.blank?) || !message.slack_hook_sendable?
|
||||||
|
end
|
||||||
|
|
||||||
def perform_reply
|
def perform_reply
|
||||||
send_message
|
send_message
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,14 @@ RSpec.describe HookJob, type: :job do
|
|||||||
described_class.perform_now(hook, event_name, event_data)
|
described_class.perform_now(hook, event_name, event_data)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'calls Integrations::Slack::SendOnSlackService when its a slack hook for template message' do
|
||||||
|
event_data = { message: create(:message, account: account, message_type: :template) }
|
||||||
|
hook = create(:integrations_hook, app_id: 'slack', account: account)
|
||||||
|
allow(Integrations::Slack::SendOnSlackService).to receive(:new).and_return(process_service)
|
||||||
|
expect(Integrations::Slack::SendOnSlackService).to receive(:new)
|
||||||
|
described_class.perform_now(hook, event_name, event_data)
|
||||||
|
end
|
||||||
|
|
||||||
it 'calls Integrations::Dialogflow::ProcessorService when its a dialogflow intergation' do
|
it 'calls Integrations::Dialogflow::ProcessorService when its a dialogflow intergation' do
|
||||||
hook = create(:integrations_hook, :dialogflow, inbox: inbox, account: account)
|
hook = create(:integrations_hook, :dialogflow, inbox: inbox, account: account)
|
||||||
allow(Integrations::Dialogflow::ProcessorService).to receive(:new).and_return(process_service)
|
allow(Integrations::Dialogflow::ProcessorService).to receive(:new).and_return(process_service)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ describe Integrations::Dialogflow::ProcessorService do
|
|||||||
let(:hook) { create(:integrations_hook, :dialogflow, inbox: inbox, account: account) }
|
let(:hook) { create(:integrations_hook, :dialogflow, inbox: inbox, account: account) }
|
||||||
let(:conversation) { create(:conversation, account: account, status: :pending) }
|
let(:conversation) { create(:conversation, account: account, status: :pending) }
|
||||||
let(:message) { create(:message, account: account, conversation: conversation) }
|
let(:message) { create(:message, account: account, conversation: conversation) }
|
||||||
|
let(:template_message) { create(:message, account: account, conversation: conversation, message_type: :template, content: 'Bot message') }
|
||||||
let(:event_name) { 'message.created' }
|
let(:event_name) { 'message.created' }
|
||||||
let(:event_data) { { message: message } }
|
let(:event_data) { { message: message } }
|
||||||
let(:dialogflow_text_double) { double }
|
let(:dialogflow_text_double) { double }
|
||||||
@@ -35,6 +36,15 @@ describe Integrations::Dialogflow::ProcessorService do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when invalid message and dialogflow returns empty block' do
|
||||||
|
it 'will not create the response message' do
|
||||||
|
event_data = { message: template_message }
|
||||||
|
processor = described_class.new(event_name: event_name, hook: hook, event_data: event_data)
|
||||||
|
processor.perform
|
||||||
|
expect(conversation.reload.messages.last.content).not_to eql('hello payload')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'when dilogflow raises exception' do
|
context 'when dilogflow raises exception' do
|
||||||
it 'tracks hook into exception tracked' do
|
it 'tracks hook into exception tracked' do
|
||||||
last_message = conversation.reload.messages.last.content
|
last_message = conversation.reload.messages.last.content
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ describe Integrations::Slack::SendOnSlackService do
|
|||||||
let!(:message) do
|
let!(:message) do
|
||||||
create(:message, account: conversation.account, inbox: conversation.inbox, conversation: conversation)
|
create(:message, account: conversation.account, inbox: conversation.inbox, conversation: conversation)
|
||||||
end
|
end
|
||||||
|
let!(:template_message) do
|
||||||
|
create(:message, account: conversation.account, inbox: conversation.inbox, conversation: conversation, message_type: :template)
|
||||||
|
end
|
||||||
|
|
||||||
let(:slack_message) { double }
|
let(:slack_message) { double }
|
||||||
let(:file_attachment) { double }
|
let(:file_attachment) { double }
|
||||||
@@ -119,6 +122,23 @@ describe Integrations::Slack::SendOnSlackService do
|
|||||||
expect(message.attachments).to be_any
|
expect(message.attachments).to be_any
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'sent a template message on slack' do
|
||||||
|
builder = described_class.new(message: template_message, hook: hook)
|
||||||
|
allow(builder).to receive(:slack_client).and_return(slack_client)
|
||||||
|
|
||||||
|
expect(slack_client).to receive(:chat_postMessage).with(
|
||||||
|
channel: hook.reference_id,
|
||||||
|
text: template_message.content,
|
||||||
|
username: "#{template_message.sender.name} (Contact)",
|
||||||
|
thread_ts: conversation.identifier,
|
||||||
|
icon_url: anything
|
||||||
|
).and_return(slack_message)
|
||||||
|
|
||||||
|
builder.perform
|
||||||
|
|
||||||
|
expect(template_message.external_source_id_slack).to eq 'cw-origin-6789.12345'
|
||||||
|
end
|
||||||
|
|
||||||
it 'disables hook on Slack AccountInactive error' do
|
it 'disables hook on Slack AccountInactive error' 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,
|
||||||
|
|||||||
Reference in New Issue
Block a user