73 lines
1.4 KiB
Ruby
73 lines
1.4 KiB
Ruby
class Integrations::Slack::OutgoingMessageBuilder
|
|
attr_reader :hook, :message
|
|
|
|
def self.perform(hook, message)
|
|
new(hook, message).perform
|
|
end
|
|
|
|
def initialize(hook, message)
|
|
@hook = hook
|
|
@message = message
|
|
end
|
|
|
|
def perform
|
|
return if message.source_id.present?
|
|
|
|
send_message
|
|
update_reference_id
|
|
end
|
|
|
|
private
|
|
|
|
def conversation
|
|
@conversation ||= message.conversation
|
|
end
|
|
|
|
def contact
|
|
@contact ||= conversation.contact
|
|
end
|
|
|
|
def agent
|
|
@agent ||= message.user
|
|
end
|
|
|
|
def message_content
|
|
if conversation.identifier.present?
|
|
message.content
|
|
else
|
|
"*Inbox: #{message.inbox.name}* \n\n #{message.content}"
|
|
end
|
|
end
|
|
|
|
def avatar_url(sender)
|
|
sender.try(:avatar_url) || "#{ENV['FRONTEND_URL']}/admin/avatar_square.png"
|
|
end
|
|
|
|
def send_message
|
|
sender = message.outgoing? ? agent : contact
|
|
sender_type = sender.class == Contact ? 'Contact' : 'Agent'
|
|
|
|
@slack_message = slack_client.chat_postMessage(
|
|
channel: hook.reference_id,
|
|
text: message_content,
|
|
username: "#{sender_type}: #{sender.try(:name)}",
|
|
thread_ts: conversation.identifier,
|
|
icon_url: avatar_url(sender)
|
|
)
|
|
end
|
|
|
|
def update_reference_id
|
|
return if conversation.identifier
|
|
|
|
conversation.identifier = @slack_message['ts']
|
|
conversation.save!
|
|
end
|
|
|
|
def slack_client
|
|
Slack.configure do |config|
|
|
config.token = hook.access_token
|
|
end
|
|
Slack::Web::Client.new
|
|
end
|
|
end
|