A regra de 24h é da Meta Cloud API. Providers que conectam via WhatsApp Web (baileys, zapi — já isentos; wuzapi, evolution — agora isentos) permitem mensagem livre a qualquer momento. Antes: agente via "Você só pode responder a esta conversa usando um modelo de mensagem devido a Restrições de janela de mensagem de 24 horas" e ficava bloqueado de digitar. Agora: MessageWindowService.messaging_window retorna nil pros 4 providers Web, o que faz can_reply? retornar true incondicionalmente. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
76 lines
2.1 KiB
Ruby
76 lines
2.1 KiB
Ruby
class Conversations::MessageWindowService
|
|
MESSAGING_WINDOW_24_HOURS = 24.hours
|
|
MESSAGING_WINDOW_7_DAYS = 7.days
|
|
|
|
def initialize(conversation)
|
|
@conversation = conversation
|
|
end
|
|
|
|
def can_reply?
|
|
return true if messaging_window.blank?
|
|
|
|
last_message_in_messaging_window?(messaging_window)
|
|
end
|
|
|
|
private
|
|
|
|
def messaging_window
|
|
case @conversation.inbox.channel_type
|
|
when 'Channel::Api'
|
|
api_messaging_window
|
|
when 'Channel::FacebookPage'
|
|
messenger_messaging_window
|
|
when 'Channel::Instagram'
|
|
instagram_messaging_window
|
|
when 'Channel::Tiktok'
|
|
tiktok_messaging_window
|
|
when 'Channel::Whatsapp'
|
|
# Providers via WhatsApp Web (baileys, zapi, wuzapi, evolution) não
|
|
# estão sujeitos à janela de 24h da Meta Cloud API — Web permite
|
|
# mensagem livre a qualquer momento.
|
|
return if %w[baileys zapi wuzapi evolution].include?(@conversation.inbox.channel.provider)
|
|
|
|
MESSAGING_WINDOW_24_HOURS
|
|
when 'Channel::TwilioSms'
|
|
twilio_messaging_window
|
|
end
|
|
end
|
|
|
|
def last_message_in_messaging_window?(time)
|
|
return false if last_incoming_message.nil?
|
|
|
|
Time.current < last_incoming_message.created_at + time
|
|
end
|
|
|
|
def api_messaging_window
|
|
return if @conversation.inbox.channel.additional_attributes['agent_reply_time_window'].blank?
|
|
|
|
@conversation.inbox.channel.additional_attributes['agent_reply_time_window'].to_i.hours
|
|
end
|
|
|
|
# Check medium of the inbox to determine the messaging window
|
|
def twilio_messaging_window
|
|
@conversation.inbox.channel.medium == 'whatsapp' ? MESSAGING_WINDOW_24_HOURS : nil
|
|
end
|
|
|
|
def messenger_messaging_window
|
|
meta_messaging_window('ENABLE_MESSENGER_CHANNEL_HUMAN_AGENT')
|
|
end
|
|
|
|
def instagram_messaging_window
|
|
meta_messaging_window('ENABLE_INSTAGRAM_CHANNEL_HUMAN_AGENT')
|
|
end
|
|
|
|
def tiktok_messaging_window
|
|
48.hours
|
|
end
|
|
|
|
def meta_messaging_window(config_key)
|
|
GlobalConfigService.load(config_key, nil) ? MESSAGING_WINDOW_7_DAYS : MESSAGING_WINDOW_24_HOURS
|
|
end
|
|
|
|
def last_incoming_message
|
|
@last_incoming_message ||= @conversation.messages.where(account_id: @conversation.account_id).incoming&.last
|
|
end
|
|
end
|