75 lines
1.5 KiB
Ruby
75 lines
1.5 KiB
Ruby
|
class Twitter::DirectMessageParserService < Twitter::WebhooksBaseService
|
||
|
pattr_initialize [:payload]
|
||
|
|
||
|
def perform
|
||
|
return if source_app_id == parent_app_id
|
||
|
|
||
|
set_inbox
|
||
|
ensure_contacts
|
||
|
set_conversation
|
||
|
@conversation.messages.create(
|
||
|
content: message_create_data['message_data']['text'],
|
||
|
account_id: @inbox.account_id,
|
||
|
inbox_id: @inbox.id,
|
||
|
message_type: outgoing_message? ? :outgoing : :incoming
|
||
|
)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def direct_message_events_params
|
||
|
payload['direct_message_events']
|
||
|
end
|
||
|
|
||
|
def direct_message_data
|
||
|
direct_message_events_params.first
|
||
|
end
|
||
|
|
||
|
def message_create_data
|
||
|
direct_message_data['message_create']
|
||
|
end
|
||
|
|
||
|
def source_app_id
|
||
|
message_create_data['source_app_id']
|
||
|
end
|
||
|
|
||
|
def parent_app_id
|
||
|
ENV.fetch('TWITTER_APP_ID', '')
|
||
|
end
|
||
|
|
||
|
def users
|
||
|
payload[:users]
|
||
|
end
|
||
|
|
||
|
def ensure_contacts
|
||
|
users.each do |key, user|
|
||
|
next if key == profile_id
|
||
|
|
||
|
find_or_create_contact(user)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def conversation_params
|
||
|
{
|
||
|
account_id: @inbox.account_id,
|
||
|
inbox_id: @inbox.id,
|
||
|
contact_id: @contact.id,
|
||
|
contact_inbox_id: @contact_inbox.id,
|
||
|
additional_attributes: {
|
||
|
type: 'direct_message'
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
|
||
|
def set_conversation
|
||
|
@conversation = @contact_inbox.conversations.first
|
||
|
return if @conversation
|
||
|
|
||
|
@conversation = ::Conversation.create!(conversation_params)
|
||
|
end
|
||
|
|
||
|
def outgoing_message?
|
||
|
message_create_data['sender_id'] == @inbox.channel.profile_id
|
||
|
end
|
||
|
end
|