fix(captain): resolve Hermes quoted replies by internal id
Some checks failed
Some checks failed
This commit is contained in:
parent
572b9ccd10
commit
cbbfccaf42
@ -5,10 +5,11 @@ class Captain::Hermes::ReplyContextBuilder
|
||||
end
|
||||
|
||||
def perform
|
||||
return nil if reply_to_external_id.blank?
|
||||
return nil if reply_reference.blank?
|
||||
|
||||
{
|
||||
external_id: reply_to_external_id,
|
||||
message_id: reply_to_message_id,
|
||||
found: quoted_message.present?,
|
||||
quoted_message: quoted_message_snapshot
|
||||
}.compact
|
||||
@ -38,6 +39,8 @@ class Captain::Hermes::ReplyContextBuilder
|
||||
[CONTEXTO DE RESPOSTA DO WHATSAPP]
|
||||
O cliente respondeu citando uma mensagem anterior.
|
||||
Interprete a resposta atual como referência direta a essa mensagem citada.
|
||||
Se a resposta atual usar termos como "esse valor", "desse valor", "essa", "esse" ou "isso",
|
||||
resolva a referência usando a mensagem citada antes do restante do histórico.
|
||||
Mensagem citada (#{quoted[:sender_label]}, #{quoted[:created_at]}): #{quoted_content}
|
||||
TEXT
|
||||
end
|
||||
@ -46,18 +49,31 @@ class Captain::Hermes::ReplyContextBuilder
|
||||
<<~TEXT.strip
|
||||
[CONTEXTO DE RESPOSTA DO WHATSAPP]
|
||||
O cliente respondeu citando uma mensagem anterior, mas o Chatwoot não encontrou o conteúdo da mensagem citada.
|
||||
ID externo citado: #{reply_context[:external_id]}
|
||||
Referência citada: #{reply_reference}
|
||||
TEXT
|
||||
end
|
||||
|
||||
def reply_reference
|
||||
reply_to_external_id.presence || reply_to_message_id.presence
|
||||
end
|
||||
|
||||
def reply_to_external_id
|
||||
@reply_to_external_id ||= message.in_reply_to_external_id.presence ||
|
||||
message.content_attributes.to_h['in_reply_to_external_id'].presence ||
|
||||
message.content_attributes.to_h[:in_reply_to_external_id].presence
|
||||
end
|
||||
|
||||
def reply_to_message_id
|
||||
@reply_to_message_id ||= message.in_reply_to_id.presence ||
|
||||
message.content_attributes.to_h['in_reply_to'].presence ||
|
||||
message.content_attributes.to_h[:in_reply_to].presence
|
||||
end
|
||||
|
||||
def quoted_message
|
||||
@quoted_message ||= conversation.messages.find_by(source_id: reply_to_external_id)
|
||||
@quoted_message ||= begin
|
||||
found_by_id = conversation.messages.find_by(id: reply_to_message_id) if reply_to_message_id.present?
|
||||
found_by_id || conversation.messages.find_by(source_id: reply_to_external_id)
|
||||
end
|
||||
end
|
||||
|
||||
def quoted_message_snapshot
|
||||
|
||||
@ -50,6 +50,40 @@ RSpec.describe Captain::Hermes::Client do
|
||||
expect(payload[:message]).to include('Pode reservar essa')
|
||||
end
|
||||
|
||||
it 'includes quoted context when Chatwoot stores the reply as an internal message id' do
|
||||
quoted_message = create(
|
||||
:message,
|
||||
account: account,
|
||||
inbox: inbox,
|
||||
conversation: conversation,
|
||||
message_type: :outgoing,
|
||||
content: "Stilo hoje fica assim:\n1h R$ 50\nValor pra ate 2 pessoas.",
|
||||
source_id: 'WAID:quoted-stilo'
|
||||
)
|
||||
reply = create(
|
||||
:message,
|
||||
account: account,
|
||||
inbox: inbox,
|
||||
conversation: conversation,
|
||||
message_type: :incoming,
|
||||
content: 'Quero uma 1 hora na suite desse valor',
|
||||
source_id: 'WAID:reply-stilo',
|
||||
in_reply_to_id: quoted_message.id
|
||||
)
|
||||
|
||||
payload = client.send(:build_payload, message: reply, conversation: conversation)
|
||||
|
||||
expect(payload[:reply_context]).to include(
|
||||
message_id: quoted_message.id,
|
||||
external_id: quoted_message.source_id,
|
||||
found: true
|
||||
)
|
||||
expect(payload[:message]).to include('Stilo hoje fica assim')
|
||||
expect(payload[:message]).to include('1h R$ 50')
|
||||
expect(payload[:message]).to include('resolva a referência usando a mensagem citada')
|
||||
expect(payload[:message]).to include('Quero uma 1 hora na suite desse valor')
|
||||
end
|
||||
|
||||
it 'keeps the combined incoming text while adding quote context' do
|
||||
quoted_message = create(
|
||||
:message,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user