vatio-sdk 0.7.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f58bd6f7a713426a74eb89e6393bcd5b678d02abc6e29cc5e9e8286a1bc6366b
4
- data.tar.gz: 36b34dfc45e5f65e74f24f14d74c54833a55ef11f8339396c3af7e0277db8b7b
3
+ metadata.gz: 8fc024c85ca67669f7b0971a9fafbd65c0932f1608e7e2ffdc8a8714088d5e5c
4
+ data.tar.gz: 4801d1b1efe265284e53ae3c2d29ae09cda61016e85c66c33547f1fe2723ae81
5
5
  SHA512:
6
- metadata.gz: 313a84c0a4b58cf9234f99acd6136bd7729bd2afc68a250341c63e63e5c9c85dcf5bd1712037763b6eaf1e3b34e468a67d3e5d36cc96430fb929e13382bdd784
7
- data.tar.gz: 994c112d1aa656138ccd9b6855b52c45422610addaee8b1a2fe47e3bb97c1f10c295da6e396c4273e77851a4e4a4b1c9aa3e2b4630be1a90994296379ba49633
6
+ metadata.gz: 5105ee83825f513850f5e0196af8c6af66dd9aa5a500e0cc9f1be60f47a1be04fd055532e432f5ee394144790d3f1186ac427686e10a5778f6605fac32d6eff8
7
+ data.tar.gz: 600c732a95c860429fab141eb4ae4a70cd945a477c1a20f1c63609a6916c7bc99334c0fed9fc8a7d679dd70b80af6e16064dd6259db816355f866646e3ee172c
data/README.md CHANGED
@@ -198,8 +198,10 @@ end
198
198
  ```
199
199
 
200
200
  A secret key belongs to one workspace and one environment, and a preview key
201
- can only write to a test phone verified in the inbox's Try the agent panel (WhatsApp). Keep
202
- it on your server: it can message your customers. Net::HTTP does the talking
201
+ can only write, from Vatio's shared WhatsApp number, to someone on the
202
+ workspace's team with their WhatsApp verified, or to a customer phone added in
203
+ the inbox's Try the agent panel (WhatsApp). Keep it on your server: it can
204
+ message your customers. Net::HTTP does the talking
203
205
  (`base_url`, `open_timeout` and `read_timeout` are there if you need them);
204
206
  there is no other dependency.
205
207
 
@@ -233,6 +235,24 @@ you:
233
235
  Vatio::Server.send_message(to: phone, brief: brief, template: shipped.with_params("Ana", "#1042"))
234
236
  ```
235
237
 
238
+ A URL button whose link ends in `{{1}}` takes its value per message, by
239
+ the button's position (`template.buttons` lists them):
240
+
241
+ ```ruby
242
+ template: offer.with_params("Ana").merge(buttons: [{ index: 0, params: [offer.code] }])
243
+ ```
244
+
245
+ Anything else a template takes (a media or text header, named
246
+ parameters, a coupon code) goes as Meta's own send components, as each
247
+ template's `example` shows:
248
+
249
+ ```ruby
250
+ template: { name: "ati_offer", language: "es", components: [
251
+ { type: "header", parameters: [{ type: "image", image: { link: photo_url } }] },
252
+ { type: "body", parameters: [{ type: "text", parameter_name: "name", text: "Ana" }] }
253
+ ] }
254
+ ```
255
+
236
256
  The response only says it is queued: the agent's turn and Meta's delivery
237
257
  both happen after it. `Vatio::Server.message_status(id)` reads it back,
238
258
  with `content` (what reached the phone) once it is sent, and
@@ -292,7 +312,7 @@ end
292
312
  | `OutsideWindow` | `outside_window`, with `last_inbound_at` |
293
313
  | `OptedOut` | `opted_out` |
294
314
  | `HumanAnswering` | `human_takeover`, `handoff_pending` |
295
- | `TemplateError` | `template_not_found` (often created in Meta a minute ago: Vatio is syncing, retry shortly), `template_not_approved`, `template_params`, `template_required` |
315
+ | `TemplateError` | `template_not_found` (often created in Meta a minute ago: Vatio is syncing, retry shortly), `template_not_approved`, `template_params`, `template_buttons`, `template_components`, `template_required` |
296
316
  | `InvalidRequest` | Any other 422: `invalid_recipient`, `content_required`, `invalid_identity`, `not_a_test_phone`… |
297
317
  | `Unauthorized` | 401 / 403: the key is wrong, revoked, or another workspace's |
298
318
  | `Conflict` | Any other 409: `idempotency_conflict` (`details["message_id"]`), `identity_conflict`, `whatsapp_not_connected`, `whatsapp_paused`, `whatsapp_number_unhealthy` (Meta refuses every send from the number; `details["issue"]` says why and the fix) |
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Vatio
4
4
  module Identity
5
- VERSION = "0.7.1"
5
+ VERSION = "0.9.0"
6
6
  end
7
7
  end
@@ -35,8 +35,12 @@ module Vatio
35
35
  # Needs no `to` or `channel`.
36
36
  # brief: what the agent should write about, and the facts to use.
37
37
  # text: your own words, sent as is.
38
- # template: { name:, language:, params: [] }, used only when the 24-hour
39
- # window is closed -- send it too to always reach the person.
38
+ # template: { name:, language:, params: [], buttons: [{ index:, params: [] }] },
39
+ # used only when the 24-hour window is closed -- send it too
40
+ # to always reach the person. `buttons` fills URL buttons
41
+ # whose link ends in {{1}}. Or { name:, language:, components: [] }
42
+ # with Meta's own send components, for anything else a
43
+ # template takes (a header, named parameters, a coupon code).
40
44
  # An authentication template takes `code:` instead of params,
41
45
  # with no brief or text, and is sent whatever the window.
42
46
  #
@@ -148,8 +152,23 @@ module Vatio
148
152
  # Accepts a Hash with symbol or string keys, or anything with `to_h`.
149
153
  def normalize_template(template)
150
154
  hash = template.to_h.transform_keys(&:to_s)
155
+ if hash.key?("components")
156
+ return { name: hash["name"], language: hash["language"], components: Array(hash["components"]) }
157
+ end
158
+
151
159
  { name: hash["name"], language: hash["language"], params: Array(hash["params"]).map(&:to_s),
152
- code: hash["code"]&.to_s }.compact
160
+ code: hash["code"]&.to_s, buttons: normalize_buttons(hash["buttons"]) }.compact
161
+ end
162
+
163
+ # [{ index: 0, params: ["ABC123"] }]: the value of each URL button whose
164
+ # link ends in {{1}}, by its position.
165
+ def normalize_buttons(buttons)
166
+ return nil if buttons.nil? || buttons.empty?
167
+
168
+ buttons.map do |button|
169
+ button = button.to_h.transform_keys(&:to_s)
170
+ { index: button["index"], params: Array(button["params"]).map(&:to_s) }
171
+ end
153
172
  end
154
173
 
155
174
  def present(value)
@@ -3,15 +3,25 @@
3
3
  module Vatio
4
4
  module Server
5
5
  # A WhatsApp template the key's number can send, from Vatio's mirror of
6
- # Meta's: its body, how many `{{n}}` parameters that body takes, and the
7
- # object `send_message` expects as `template:`.
6
+ # Meta's: its body, how many `{{n}}` parameters that body takes, its
7
+ # buttons, and the object `send_message` expects as `template:`.
8
8
  #
9
9
  # shipped = Vatio::Server.templates.find { |t| t.name == "order_shipped" }
10
10
  # Vatio::Server.send_message(to: phone, brief: brief, template: shipped.with_params("Ana", "#1042"))
11
11
  #
12
+ # A URL button whose link ends in {{1}} takes its value by position:
13
+ #
14
+ # template: offer.with_params("Ana").merge(buttons: [{ index: 0, params: ["ABC123"] }])
15
+ #
16
+ # Anything else it takes (a header, named parameters, a coupon code) goes
17
+ # as Meta's own send components; `example` shows them:
18
+ #
19
+ # template: { name: t.name, language: t.language, components: [...] }
20
+ #
12
21
  # Empty on a preview key: the preview number's templates are Vatio's.
13
22
  Template = Struct.new(
14
- :name, :language, :category, :status, :rejected_reason, :body, :parameter_count, :example,
23
+ :name, :language, :category, :status, :rejected_reason, :body, :parameter_count, :parameter_format, :buttons,
24
+ :components, :example,
15
25
  keyword_init: true
16
26
  ) do
17
27
  def self.from(hash) = Value.build(self, hash)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vatio-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Urcalab