Class: Whatsapp::Messages

Inherits:
Object
  • Object
show all
Extended by:
ResponseHandling
Includes:
ResponseHandling
Defined in:
lib/ruby/whatsapp/messages.rb,
lib/ruby/whatsapp/messages/base.rb,
lib/ruby/whatsapp/messages/text.rb,
lib/ruby/whatsapp/messages/audio.rb,
lib/ruby/whatsapp/messages/image.rb,
lib/ruby/whatsapp/messages/video.rb,
lib/ruby/whatsapp/messages/address.rb,
lib/ruby/whatsapp/messages/sticker.rb,
lib/ruby/whatsapp/messages/contacts.rb,
lib/ruby/whatsapp/messages/document.rb,
lib/ruby/whatsapp/messages/location.rb,
lib/ruby/whatsapp/messages/reaction.rb,
lib/ruby/whatsapp/messages/response.rb,
lib/ruby/whatsapp/messages/template.rb,
lib/ruby/whatsapp/messages/interactive.rb,
lib/ruby/whatsapp/messages/contacts/org.rb,
lib/ruby/whatsapp/messages/contacts/url.rb,
lib/ruby/whatsapp/messages/contacts/name.rb,
lib/ruby/whatsapp/messages/contacts/email.rb,
lib/ruby/whatsapp/messages/contacts/phone.rb,
lib/ruby/whatsapp/messages/contacts/address.rb,
lib/ruby/whatsapp/messages/contacts/contact.rb,
lib/ruby/whatsapp/messages/interactive/base.rb,
lib/ruby/whatsapp/messages/interactive/body.rb,
lib/ruby/whatsapp/messages/location_request.rb,
lib/ruby/whatsapp/messages/response/contacts.rb,
lib/ruby/whatsapp/messages/response/messages.rb,
lib/ruby/whatsapp/messages/template/language.rb,
lib/ruby/whatsapp/messages/interactive/footer.rb,
lib/ruby/whatsapp/messages/interactive/header.rb,
lib/ruby/whatsapp/messages/template/component.rb,
lib/ruby/whatsapp/messages/template/parameter.rb,
lib/ruby/whatsapp/messages/mark_message_as_read.rb,
lib/ruby/whatsapp/messages/interactive/url_button.rb,
lib/ruby/whatsapp/messages/interactive/list_buttons.rb,
lib/ruby/whatsapp/messages/interactive/reply_buttons.rb,
lib/ruby/whatsapp/messages/interactive/media_carousel.rb,
lib/ruby/whatsapp/messages/interactive/product_carousel.rb,
lib/ruby/whatsapp/messages/interactive/media_carousel/card.rb,
lib/ruby/whatsapp/messages/interactive/list_buttons/section.rb,
lib/ruby/whatsapp/messages/interactive/reply_buttons/button.rb,
lib/ruby/whatsapp/messages/interactive/product_carousel/card.rb,
lib/ruby/whatsapp/messages/interactive/list_buttons/section/row.rb,
lib/ruby/whatsapp/messages/interactive/media_carousel/card/button.rb,
lib/ruby/whatsapp/messages/interactive/media_carousel/card/button/quick_reply.rb

Defined Under Namespace

Classes: Address, Audio, Base, Contacts, Document, Image, Interactive, Location, LocationRequest, MarkMessageAsRead, PayloadError, Reaction, Response, Sticker, Template, Text, Video

Constant Summary collapse

KINDS =

Maps a public message kind to its implementing class. Resolution goes through this frozen whitelist (never const_get on caller input), so an unknown or hostile kind can only raise, never resolve an arbitrary constant.

{
  text: Text,
  image: Image,
  audio: Audio,
  video: Video,
  document: Document,
  sticker: Sticker,
  contacts: Contacts,
  reaction: Reaction,
  location: Location,
  address: Address,
  location_request: LocationRequest,
  template: Template,
  interactive: Interactive,
}.freeze

Constants included from ResponseHandling

ResponseHandling::MAX_ERROR_BODY

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(kind:, payload:, client: Client.new) ⇒ Messages

Returns a new instance of Messages.

Parameters:

  • kind (Symbol, String)

    The type of message (e.g., :text, :template)

  • payload (Hash)

    The message payload passed to the message class

  • client (Whatsapp::Client) (defaults to: Client.new)

    The WhatsApp client instance

Raises:



75
76
77
78
79
80
81
82
# File 'lib/ruby/whatsapp/messages.rb', line 75

def initialize(kind:, payload:, client: Client.new)
  klass = KINDS.fetch(kind.to_sym) do
    raise PayloadError, "Unknown message kind: #{kind.inspect}. Known kinds: #{KINDS.keys.join(', ')}"
  end

  @payload = klass.new(**payload)
  @client = client
end

Instance Attribute Details

#clientWhatsapp::Client

Returns:



69
70
71
# File 'lib/ruby/whatsapp/messages.rb', line 69

def client
  @client
end

#payloadWhatsapp::Messages::Base



65
66
67
# File 'lib/ruby/whatsapp/messages.rb', line 65

def payload
  @payload
end

Class Method Details

.mark_message_as_read!(message_id:, client: Client.new) ⇒ Whatsapp::Messages::Response

Marks a previously received message as read. Deliberately not part of KINDS: this action has no recipient/type envelope, so it can't be dispatched through the kind:/payload: factory the way the rest of the message kinds are.

Parameters:

  • message_id (String)

    The WhatsApp message ID (WAMID) to mark as read.

  • client (Whatsapp::Client) (defaults to: Client.new)

    The WhatsApp client instance

Returns:

Raises:

  • (ActiveModel::ValidationError)

    if message_id is missing

  • (Whatsapp::RequestError)

    if the request fails



48
49
50
51
52
53
54
55
56
57
58
# File 'lib/ruby/whatsapp/messages.rb', line 48

def mark_message_as_read!(message_id:, client: Client.new)
  payload = MarkMessageAsRead.new(message_id:)

  response = client.connection.post(
    client.path_for(client.phone_id, "messages"),
    json: payload.serialize
  )

  checked_response = handle_response!(response, error_class: RequestError, action: "mark message as read")
  Response.deserialize(parse_json(checked_response))
end

Instance Method Details

#send!Object

Sends the message to the WhatsApp API. @return [Whatsapp::Messages::Response] The response from the API @raise [Whatsapp::Messages::PayloadError] if the payload is invalid @raise [Whatsapp::RequestError] if the request fails

Raises:



88
89
90
91
92
93
# File 'lib/ruby/whatsapp/messages.rb', line 88

def send!
  raise PayloadError, "Invalid message: #{payload.errors.full_messages.join(', ')}" unless payload.valid?

  response = perform_request!
  parse!(response)
end