* feat(whatsapp): show contact typing and recording indicators via baileys presence Subscribe to WhatsApp presence updates via the baileys-api provider to display real-time typing and recording indicators in the dashboard. - Handle presence.update webhook events (composing, recording, paused, available) and broadcast via ActionCable - Add conversation.recording event to ActionCable, webhook, and channel listeners for parity with typing_on/typing_off - Show "typing..." / "recording..." in green text on the chat list, replacing the message preview - Show "X is typing" / "X is recording audio" in the conversation view - Add presence_subscribe provider config option (default off) to gate all subscription calls to the baileys-api - Subscribe to presence on conversation open and periodically (1 min) for the top 10 chat list conversations - Consolidate contact LID from presence.update jidAlt payload - Prevent echo-back of contact typing events to the channel Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: address review feedback - Filter chat list typing indicator to contact-only events - Add dedupe to presence subscribe bulk calls - Use strong parameters for conversation_ids - Remove redundant YAML quotes in swagger webhook enum Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: address review feedback - Extract phone from data[:id] when JID is @s.whatsapp.net (fallback when jidAlt is absent) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: address review feedback - Filter recording users in getTypingUsersText to show correct names - Add 10s timeout to presence_subscribe HTTP request Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: scope typing timer per user instead of per conversation Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: make presence subscribe best-effort with rescue per channel Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: address review feedback - Add messagePreviewClass to typing preview for consistent padding - Fix specs to use WebMock assertions instead of instance spying Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
31 lines
1.4 KiB
Ruby
31 lines
1.4 KiB
Ruby
class Whatsapp::IncomingMessageBaileysService < Whatsapp::IncomingMessageBaseService
|
|
include Events::Types
|
|
include Whatsapp::BaileysHandlers::ConnectionUpdate
|
|
include Whatsapp::BaileysHandlers::MessagesUpsert
|
|
include Whatsapp::BaileysHandlers::MessagesUpdate
|
|
include Whatsapp::BaileysHandlers::MessageReceiptUpdate
|
|
include Whatsapp::BaileysHandlers::GroupParticipantsUpdate
|
|
include Whatsapp::BaileysHandlers::GroupsUpdate
|
|
include Whatsapp::BaileysHandlers::GroupsActivity
|
|
include Whatsapp::BaileysHandlers::PresenceUpdate
|
|
|
|
class InvalidWebhookVerifyToken < StandardError; end
|
|
|
|
def perform # rubocop:disable Metrics/AbcSize
|
|
raise InvalidWebhookVerifyToken if processed_params[:webhookVerifyToken] != inbox.channel.provider_config['webhook_verify_token']
|
|
return if processed_params[:event].blank? || processed_params[:data].blank?
|
|
|
|
Rails.configuration.dispatcher.dispatch(PROVIDER_EVENT_RECEIVED, Time.zone.now, inbox: inbox, event: processed_params[:event],
|
|
payload: processed_params[:data])
|
|
|
|
event_prefix = processed_params[:event].gsub(/[\.-]/, '_')
|
|
method_name = "process_#{event_prefix}"
|
|
if respond_to?(method_name, true)
|
|
# TODO: Implement the methods for all expected events
|
|
send(method_name)
|
|
else
|
|
Rails.logger.warn "Baileys unsupported event: #{processed_params[:event]}"
|
|
end
|
|
end
|
|
end
|