chore: Add message_echo listener for Facebook (#1192)

Co-authored-by: Sojan Jose <sojan@pepalo.com>
This commit is contained in:
Pranav Raj S 2020-09-04 19:13:47 +05:30 committed by GitHub
parent 715bd368f4
commit d18c8fc08a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 51 additions and 11 deletions

View file

@ -19,4 +19,10 @@ class FacebookBot
updater.perform updater.perform
Rails.logger.info "Human was online at #{delivery.at}" Rails.logger.info "Human was online at #{delivery.at}"
end end
Bot.on :message_echo do |message|
Rails.logger.info "MESSAGE_ECHO #{message}"
response = ::Integrations::Facebook::MessageParser.new(message)
::Integrations::Facebook::MessageCreator.new(response).perform
end
end end

View file

@ -10,8 +10,9 @@ class Messages::Facebook::MessageBuilder
def initialize(response, inbox, outgoing_echo = false) def initialize(response, inbox, outgoing_echo = false)
@response = response @response = response
@inbox = inbox @inbox = inbox
@sender_id = (outgoing_echo ? @response.recipient_id : @response.sender_id) @outgoing_echo = outgoing_echo
@message_type = (outgoing_echo ? :outgoing : :incoming) @sender_id = (@outgoing_echo ? @response.recipient_id : @response.sender_id)
@message_type = (@outgoing_echo ? :outgoing : :incoming)
end end
def perform def perform
@ -120,7 +121,7 @@ class Messages::Facebook::MessageBuilder
message_type: @message_type, message_type: @message_type,
content: response.content, content: response.content,
source_id: response.identifier, source_id: response.identifier,
sender: contact sender: @outgoing_echo ? nil : contact
} }
end end

View file

@ -17,6 +17,10 @@ class Channel::Api < ApplicationRecord
has_one :inbox, as: :channel, dependent: :destroy has_one :inbox, as: :channel, dependent: :destroy
def name
'API'
end
def has_24_hour_messaging_window? def has_24_hour_messaging_window?
false false
end end

View file

@ -26,6 +26,10 @@ class Channel::Email < ApplicationRecord
has_one :inbox, as: :channel, dependent: :destroy has_one :inbox, as: :channel, dependent: :destroy
before_validation :ensure_forward_to_address, on: :create before_validation :ensure_forward_to_address, on: :create
def name
'Email'
end
def has_24_hour_messaging_window? def has_24_hour_messaging_window?
false false
end end

View file

@ -28,6 +28,10 @@ class Channel::FacebookPage < ApplicationRecord
after_create_commit :subscribe after_create_commit :subscribe
before_destroy :unsubscribe before_destroy :unsubscribe
def name
'Facebook'
end
def has_24_hour_messaging_window? def has_24_hour_messaging_window?
true true
end end

View file

@ -30,11 +30,11 @@ class Channel::TwilioSms < ApplicationRecord
has_one :inbox, as: :channel, dependent: :destroy has_one :inbox, as: :channel, dependent: :destroy
def name
medium == :sms ? 'Twilio SMS' : 'Whatsapp'
end
def has_24_hour_messaging_window? def has_24_hour_messaging_window?
true true
end end
def name
'Twilio SMS'
end
end end

View file

@ -26,6 +26,10 @@ class Channel::TwitterProfile < ApplicationRecord
before_destroy :unsubscribe before_destroy :unsubscribe
def name
'Twitter'
end
def has_24_hour_messaging_window? def has_24_hour_messaging_window?
false false
end end

View file

@ -33,6 +33,10 @@ class Channel::WebWidget < ApplicationRecord
2 => :emoji_picker, 2 => :emoji_picker,
:column => 'feature_flags' :column => 'feature_flags'
def name
'Website'
end
def has_24_hour_messaging_window? def has_24_hour_messaging_window?
false false
end end

View file

@ -66,6 +66,10 @@ class Inbox < ApplicationRecord
channel.class.name.to_s == 'Channel::WebWidget' channel.class.name.to_s == 'Channel::WebWidget'
end end
def inbox_type
channel.name
end
def webhook_data def webhook_data
{ {
id: id, id: id,

View file

@ -32,7 +32,7 @@ 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}* \n\n #{message.content}" "*Inbox: #{message.inbox.name} [#{message.inbox.inbox_type}]* \n\n #{message.content}"
end end
end end
@ -43,11 +43,12 @@ class Integrations::Slack::SendOnSlackService < Base::SendOnChannelService
def send_message def send_message
sender = message.sender sender = message.sender
sender_type = sender.class == Contact ? 'Contact' : 'Agent' sender_type = sender.class == Contact ? 'Contact' : 'Agent'
sender_name = sender.try(:name) ? "#{sender_type}: #{sender.try(:name)}" : sender_type
@slack_message = slack_client.chat_postMessage( @slack_message = slack_client.chat_postMessage(
channel: hook.reference_id, channel: hook.reference_id,
text: message_content, text: message_content,
username: "#{sender_type}: #{sender.try(:name)}", username: sender_name,
thread_ts: conversation.identifier, thread_ts: conversation.identifier,
icon_url: avatar_url(sender) icon_url: avatar_url(sender)
) )

View file

@ -3,10 +3,14 @@
require 'rails_helper' require 'rails_helper'
RSpec.describe Channel::FacebookPage do RSpec.describe Channel::FacebookPage do
before { create(:channel_facebook_page) } let(:channel) { create(:channel_facebook_page) }
it { is_expected.to validate_presence_of(:account_id) } it { is_expected.to validate_presence_of(:account_id) }
# it { is_expected.to validate_uniqueness_of(:page_id).scoped_to(:account_id) } # it { is_expected.to validate_uniqueness_of(:page_id).scoped_to(:account_id) }
it { is_expected.to belong_to(:account) } it { is_expected.to belong_to(:account) }
it { is_expected.to have_one(:inbox).dependent(:destroy) } it { is_expected.to have_one(:inbox).dependent(:destroy) }
it 'has a valid name' do
expect(channel.name).to eq('Facebook')
end
end end

View file

@ -69,13 +69,17 @@ RSpec.describe Inbox do
it do it do
expect(inbox.facebook?).to eq(true) expect(inbox.facebook?).to eq(true)
expect(inbox.inbox_type).to eq('Facebook')
end end
end end
context 'when the channel type is not Channel::FacebookPage' do context 'when the channel type is not Channel::FacebookPage' do
let(:channel_val) { Channel::WebWidget.new } let(:channel_val) { Channel::WebWidget.new }
it { expect(inbox.facebook?).to eq(false) } it do
expect(inbox.facebook?).to eq(false)
expect(inbox.inbox_type).to eq('Website')
end
end end
end end
end end