81 lines
2.8 KiB
Ruby
81 lines
2.8 KiB
Ruby
module Captain
|
|
module Tools
|
|
class ReactToMessageTool < BaseTool
|
|
def name
|
|
'react_to_message'
|
|
end
|
|
|
|
def description
|
|
'Envia uma reação de emoji à última mensagem do cliente no WhatsApp. Use SEMPRE quando o cliente enviar agradecimentos, elogios ou emojis.'
|
|
end
|
|
|
|
def tool_parameters_schema
|
|
{
|
|
type: 'object',
|
|
properties: {
|
|
emoji: {
|
|
type: 'string',
|
|
description: 'O emoji para reagir. Use ❤️ para agradecimentos, 👍 para confirmações, 😊 para saudações.'
|
|
}
|
|
},
|
|
required: ['emoji']
|
|
}
|
|
end
|
|
|
|
def initialize(assistant, user: nil, conversation: nil)
|
|
super(assistant, user: user, conversation: conversation)
|
|
end
|
|
|
|
def execute(*args, **params)
|
|
actual_params = resolve_params(args, params)
|
|
emoji = actual_params[:emoji]
|
|
return error_response('Conversation not found') unless @conversation.present?
|
|
return error_response('Emoji is required') if emoji.blank?
|
|
|
|
# Get the last incoming message from the customer
|
|
last_customer_message = @conversation.messages.incoming.last
|
|
if last_customer_message.blank?
|
|
Rails.logger.warn "[ReactToMessageTool] Failure: No incoming message found for conversation #{@conversation.id}"
|
|
return error_response('No customer message to react to')
|
|
end
|
|
|
|
# Get the external message ID (source_id) - required for WhatsApp reactions
|
|
message_external_id = last_customer_message.source_id
|
|
if message_external_id.blank?
|
|
Rails.logger.warn "[ReactToMessageTool] Failure: Message #{last_customer_message.id} has no source_id"
|
|
return error_response('Message has no external ID for reaction')
|
|
end
|
|
|
|
Rails.logger.info "[ReactToMessageTool] Reacting to message #{last_customer_message.id} (source: #{message_external_id}) with #{emoji}"
|
|
|
|
create_reaction_message(last_customer_message, emoji, message_external_id)
|
|
|
|
{ success: true, message: "Reacted with #{emoji}" }.to_json
|
|
rescue StandardError => e
|
|
Rails.logger.error "[ReactToMessageTool] Failed: #{e.message}"
|
|
error_response(e.message)
|
|
end
|
|
|
|
private
|
|
|
|
def create_reaction_message(_target_message, emoji, external_id)
|
|
@conversation.messages.create!(
|
|
account_id: @conversation.account_id,
|
|
inbox_id: @conversation.inbox_id,
|
|
sender: @assistant,
|
|
message_type: :outgoing,
|
|
content: emoji,
|
|
content_attributes: {
|
|
'in_reply_to_external_id' => external_id,
|
|
'is_reaction' => true
|
|
}
|
|
)
|
|
end
|
|
|
|
def error_response(message)
|
|
{ success: false, error: message }.to_json
|
|
end
|
|
end
|
|
end
|
|
end
|