feat: Ability to receive attachments from LINE messenger (#3094)

Add support to add videos, audio, and images from line to chatwoot.

Fixes #3039
This commit is contained in:
Murtaza Bagwala
2021-10-11 19:06:41 +05:30
committed by GitHub
parent 2c3e37b157
commit 3d3f0ff6ee
3 changed files with 180 additions and 5 deletions

View File

@@ -14,20 +14,63 @@ class Line::IncomingMessageService
set_contact
set_conversation
# TODO: iterate over the events and handle the attachments in future
# https://github.com/line/line-bot-sdk-ruby#synopsis
parse_events
end
private
def parse_events
params[:events].each do |event|
next unless message_created? event
attach_files event['message']
end
end
def message_created?(event)
return unless event_type_message?(event)
@message = @conversation.messages.create(
content: params[:events].first['message']['text'],
content: event['message']['text'],
account_id: @inbox.account_id,
inbox_id: @inbox.id,
message_type: :incoming,
sender: @contact,
source_id: (params[:events].first['message']['id']).to_s
source_id: event['message']['id'].to_s
)
@message
end
def attach_files(message)
return unless message_type_non_text?(message['type'])
response = inbox.channel.client.get_message_content(message['id'])
file_name = "media-#{message['id']}.#{response.content_type.split('/')[1]}"
temp_file = Tempfile.new(file_name)
temp_file.binmode
temp_file << response.body
temp_file.rewind
@message.attachments.new(
account_id: @message.account_id,
file_type: file_content_type(response),
file: {
io: temp_file,
filename: file_name,
content_type: response.content_type
}
)
@message.save!
end
private
def event_type_message?(event)
event['type'] == 'message'
end
def message_type_non_text?(type)
[Line::Bot::Event::MessageType::Video, Line::Bot::Event::MessageType::Audio, Line::Bot::Event::MessageType::Image].include?(type)
end
def account
@account ||= inbox.account
@@ -70,4 +113,8 @@ class Line::IncomingMessageService
avatar_url: line_contact_info['pictureUrl']
}
end
def file_content_type(file_content)
file_type(file_content.content_type)
end
end