whatsapp_sdk 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -1
- data/CHANGELOG.md +6 -1
- data/README.md +48 -70
- data/example.rb +160 -0
- data/lib/version.rb +1 -1
- data/lib/whatsapp_sdk/api/messages.rb +52 -9
- data/lib/whatsapp_sdk/api/response.rb +2 -1
- data/lib/whatsapp_sdk/api/responses/read_message_data_response.rb +1 -1
- data/lib/whatsapp_sdk/resource/button_parameter.rb +65 -0
- data/lib/whatsapp_sdk/resource/component.rb +85 -0
- data/lib/whatsapp_sdk/resource/currency.rb +36 -0
- data/lib/whatsapp_sdk/resource/date_time.rb +22 -0
- data/lib/whatsapp_sdk/resource/media.rb +86 -0
- data/lib/whatsapp_sdk/resource/parameter_object.rb +134 -0
- data/lib/whatsapp_sdk.rb +7 -0
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b4f5058be0fce569741f60508e508ec0b1cba2eccffbc5f510d7312cb023847b
|
4
|
+
data.tar.gz: 0af25be3aad6fdb5ffc60b014745294a0fa5cf496ce11ce68ebb886a774dfca4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f1ede78aafc6391e5de55ac4aa338a3286d5a9eb634a6afac22bf28cf39afa2f8e8356db2f266aa1bb7101ca122497b6036b843146fb77890c6f10d7460f7f8
|
7
|
+
data.tar.gz: 4b7524e665d2c13e4b8561e125b1cdbccbdfc1f95c49b7b465ce0e368918ce239a17afb58d83625b28a3288d803b25680b78167a967e69f3575d27071f7d9d2c
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
# Unreleased
|
2
|
+
# v 0.1.0
|
3
|
+
- Added Message Template API.
|
4
|
+
- Added Currency and Datetime resources.
|
5
|
+
- Added Media resource.
|
6
|
+
- Added Component and ParameterObject resource.
|
7
|
+
- Fixed bug in recipient_number in Messages API.
|
2
8
|
|
3
9
|
# v 0.0.2
|
4
10
|
- Implement read message.
|
5
11
|
- Implement Yard doc.
|
6
|
-
|
data/README.md
CHANGED
@@ -117,98 +117,76 @@ messages_api.send_sticker(sender_id: 123123, recipient_number: "56789", sticker_
|
|
117
117
|
```
|
118
118
|
|
119
119
|
**Send contacts message**
|
120
|
-
To send a contact, you need to create a Contact instance object that contain objects embedded like
|
121
|
-
`addresses`, `birthday`, `emails`, `name`, `org`. See this [guide](/test/contact_helper.rb) to learn how to create contacts objects.
|
120
|
+
To send a contact, you need to create a Contact instance object that contain objects embedded like `addresses`, `birthday`, `emails`, `name`, `org`. See this [guide](/test/contact_helper.rb) to learn how to create contacts objects.
|
122
121
|
|
123
122
|
```ruby
|
124
123
|
contacts = [create_contact(params)]
|
125
124
|
messages_api.send_contacts(sender_id: 123123, recipient_number: "56789", contacts: contacts)
|
126
125
|
```
|
127
126
|
|
128
|
-
|
129
|
-
|
130
|
-
<details><summary>Example in a single file. </summary>
|
131
|
-
|
132
|
-
1) Copy this code into a file and save it `example.rb`
|
133
|
-
2) Replace the `ACCESS_TOKEN` constant with a valid `access_token`.
|
134
|
-
3) Run the file with the command `ruby example.rb`
|
135
|
-
|
127
|
+
Alernative, you could pass a plain json like this:
|
136
128
|
```ruby
|
137
|
-
|
138
|
-
|
139
|
-
require 'bundler/inline'
|
140
|
-
|
141
|
-
gemfile(true) do
|
142
|
-
source 'https://rubygems.org'
|
143
|
-
|
144
|
-
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
145
|
-
|
146
|
-
gem "whatsapp_sdk"
|
147
|
-
gem "pry"
|
148
|
-
gem "pry-nav"
|
149
|
-
end
|
150
|
-
|
151
|
-
require 'whatsapp_sdk'
|
152
|
-
require "pry"
|
153
|
-
require "pry-nav"
|
129
|
+
messages_api.send_contacts(sender_id: 123123, recipient_number: "56789", contacts_json: {...})
|
130
|
+
```
|
154
131
|
|
155
|
-
|
156
|
-
|
157
|
-
RECEIPIENT_NUMBER = "1234"
|
132
|
+
**Send a template message**
|
133
|
+
WhatsApp message templates are specific message formats that businesses use to send out notifications or customer care messages to people that have opted in to notifications. Messages can include appointment reminders, shipping information, issue resolution or payment updates.
|
158
134
|
|
159
|
-
|
160
|
-
messages_api = WhatsappSdk::Api::Messages.new(client)
|
161
|
-
phone_numbers_api = WhatsappSdk::Api::PhoneNumbers.new(client)
|
135
|
+
**Before sending a message template, you need to create one.** visit the [Official API Documentation](https://developers.facebook.com/docs/whatsapp/cloud-api/guides/send-message-templates)
|
162
136
|
|
163
|
-
|
164
|
-
phone_numbers_api.registered_numbers("114503234599312")
|
137
|
+
<details> <summary>Component's example</summary>
|
165
138
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
139
|
+
```ruby
|
140
|
+
currency = WhatsappSdk::Resource::Currency.new(code: "USD", amount: 1000, fallback_value: "1000")
|
141
|
+
date_time = WhatsappSdk::Resource::DateTime.new(fallback_value: "2020-01-01T00:00:00Z")
|
142
|
+
image = WhatsappSdk::Resource::Media.new(type: "image", link: "http(s)://URL")
|
143
|
+
|
144
|
+
parameter_image = WhatsappSdk::Resource::ParameterObject.new(type: "image", image: image)
|
145
|
+
parameter_text = WhatsappSdk::Resource::ParameterObject.new(type: "text", text: "TEXT_STRING")
|
146
|
+
parameter_currency = WhatsappSdk::Resource::ParameterObject.new(type: "currency", currency: currency)
|
147
|
+
parameter_date_time = WhatsappSdk::Resource::ParameterObject.new(type: "date_time", date_time: date_time)
|
148
|
+
|
149
|
+
header_component = WhatsappSdk::Resource::Component.new(
|
150
|
+
type: WhatsappSdk::Resource::Component::Type::HEADER,
|
151
|
+
parameters: [parameter_image]
|
170
152
|
)
|
171
153
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
messages_api.send_image(
|
176
|
-
sender_id: SENDER_ID, recipient_number: RECEIPIENT_NUMBER, link: "image_link", caption: "Ignacio Chiazzo Profile"
|
154
|
+
body_component = WhatsappSdk::Resource::Component.new(
|
155
|
+
type: WhatsappSdk::Resource::Component::Type::BODY,
|
156
|
+
parameters: [parameter_text, parameter_currency, parameter_date_time]
|
177
157
|
)
|
178
158
|
|
179
|
-
|
180
|
-
|
181
|
-
|
159
|
+
button_component1 = WhatsappSdk::Resource::Component.new(
|
160
|
+
type: WhatsappSdk::Resource::Component::Type::BUTTON,
|
161
|
+
index: 0,
|
162
|
+
sub_type: WhatsappSdk::Resource::Component::Subtype::QUICK_REPLY,
|
163
|
+
parameters: [
|
164
|
+
WhatsappSdk::Resource::ButtonParameter.new(type: "payload", payload: "PAYLOAD")
|
165
|
+
]
|
182
166
|
)
|
183
167
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
# Send documents
|
192
|
-
## with a link
|
193
|
-
messages_api.send_document(
|
194
|
-
sender_id: SENDER_ID, recipient_number: RECEIPIENT_NUMBER, link: "document_link", caption: "Ignacio Chiazzo"
|
168
|
+
button_component2 = WhatsappSdk::Resource::Component.new(
|
169
|
+
type: WhatsappSdk::Resource::Component::Type::BUTTON,
|
170
|
+
index: 1,
|
171
|
+
sub_type: WhatsappSdk::Resource::Component::Subtype::QUICK_REPLY,
|
172
|
+
parameters: [
|
173
|
+
WhatsappSdk::Resource::ButtonParameter.new(type: "payload", payload: "PAYLOAD")
|
174
|
+
]
|
195
175
|
)
|
176
|
+
@messages_api.send_template(sender_id: 12_345, recipient_number: "12345678", name: "hello_world", language: "en_US", components_json: [component_1])
|
177
|
+
```
|
196
178
|
|
197
|
-
|
198
|
-
messages_api.send_document(
|
199
|
-
sender_id: SENDER_ID, recipient_number: RECEIPIENT_NUMBER, document_id: "1234", caption: "Ignacio Chiazzo"
|
200
|
-
)
|
179
|
+
</details>
|
201
180
|
|
202
|
-
|
203
|
-
|
204
|
-
messages_api.
|
181
|
+
Alernative, you could pass a plain json like this:
|
182
|
+
```ruby
|
183
|
+
@messages_api.send_template(sender_id: 12_345, recipient_number: "12345678", name: "hello_world", language: "en_US", components_json: [{...}])
|
184
|
+
```
|
205
185
|
|
206
|
-
##
|
207
|
-
|
208
|
-
|
186
|
+
## Example
|
187
|
+
|
188
|
+
Visit [the example file](/example.rb) with examples to call the API in a single file.
|
209
189
|
|
210
|
-
```
|
211
|
-
</details>
|
212
190
|
|
213
191
|
## Whatsapp Cloud API
|
214
192
|
|
data/example.rb
ADDED
@@ -0,0 +1,160 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# 1) Copy this code into a file and save it `example.rb`
|
4
|
+
# 2) Replace the `ACCESS_TOKEN` constant with a valid `access_token`.
|
5
|
+
# 3) Run the file with the command `ruby example.rb`
|
6
|
+
|
7
|
+
require 'bundler/inline'
|
8
|
+
|
9
|
+
gemfile(true) do
|
10
|
+
source 'https://rubygems.org'
|
11
|
+
|
12
|
+
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
13
|
+
|
14
|
+
gem "whatsapp_sdk"
|
15
|
+
gem "pry"
|
16
|
+
gem "pry-nav"
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'whatsapp_sdk'
|
20
|
+
require "pry"
|
21
|
+
require "pry-nav"
|
22
|
+
|
23
|
+
ACCESS_TOKEN = "foo" # replace this with a valid access_token
|
24
|
+
SENDER_ID = 123
|
25
|
+
RECIPIENT_NUMBER = "456"
|
26
|
+
|
27
|
+
client = WhatsappSdk::Api::Client.new(ACCESS_TOKEN) # replace this with a valid access_token
|
28
|
+
messages_api = WhatsappSdk::Api::Messages.new(client)
|
29
|
+
phone_numbers_api = WhatsappSdk::Api::PhoneNumbers.new(client)
|
30
|
+
|
31
|
+
phone_numbers_api.registered_number("123")
|
32
|
+
phone_numbers_api.registered_numbers("457")
|
33
|
+
|
34
|
+
messages_api.send_text(sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, message: "hola")
|
35
|
+
messages_api.send_location(
|
36
|
+
sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER,
|
37
|
+
longitude: 45.4215, latitude: 75.6972, name: "nacho", address: "141 cooper street"
|
38
|
+
)
|
39
|
+
|
40
|
+
# Send images
|
41
|
+
|
42
|
+
## with a link
|
43
|
+
messages_api.send_image(
|
44
|
+
sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, link: "image_link", caption: "Ignacio Chiazzo Profile"
|
45
|
+
)
|
46
|
+
|
47
|
+
## with an image id
|
48
|
+
messages_api.send_image(
|
49
|
+
sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, image_id: "1234", caption: "Ignacio Chiazzo Profile"
|
50
|
+
)
|
51
|
+
|
52
|
+
# Send audios
|
53
|
+
## with a link
|
54
|
+
messages_api.send_audio(sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, link: "audio_link")
|
55
|
+
|
56
|
+
## with an audio id
|
57
|
+
messages_api.send_audio(sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, audio_id: "1234")
|
58
|
+
|
59
|
+
# Send documents
|
60
|
+
## with a link
|
61
|
+
messages_api.send_document(
|
62
|
+
sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, link: "document_link", caption: "Ignacio Chiazzo"
|
63
|
+
)
|
64
|
+
|
65
|
+
## with a document id
|
66
|
+
messages_api.send_document(
|
67
|
+
sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, document_id: "1234", caption: "Ignacio Chiazzo"
|
68
|
+
)
|
69
|
+
|
70
|
+
# send stickers
|
71
|
+
## with a link
|
72
|
+
messages_api.send_sticker(sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, link: "link")
|
73
|
+
|
74
|
+
## with a sticker_id
|
75
|
+
messages_api.send_sticker(sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, sticker_id: "1234")
|
76
|
+
|
77
|
+
# Send a template.
|
78
|
+
# Note: The template must have been created previously.
|
79
|
+
|
80
|
+
header_component = WhatsappSdk::Resource::Component.new(
|
81
|
+
type: WhatsappSdk::Resource::Component::Type::HEADER
|
82
|
+
)
|
83
|
+
|
84
|
+
image = WhatsappSdk::Resource::Media.new(type: "image", link: "http(s)://URL", caption: "caption")
|
85
|
+
document = WhatsappSdk::Resource::Media.new(type: "document", link: "http(s)://URL", filename: "txt.rb")
|
86
|
+
video = WhatsappSdk::Resource::Media.new(type: "video", id: 123)
|
87
|
+
|
88
|
+
parameter_image = WhatsappSdk::Resource::ParameterObject.new(
|
89
|
+
type: "image",
|
90
|
+
image: image
|
91
|
+
)
|
92
|
+
|
93
|
+
parameter_document = WhatsappSdk::Resource::ParameterObject.new(
|
94
|
+
type: "document",
|
95
|
+
document: document
|
96
|
+
)
|
97
|
+
|
98
|
+
parameter_video = WhatsappSdk::Resource::ParameterObject.new(
|
99
|
+
type: "video",
|
100
|
+
video: video
|
101
|
+
)
|
102
|
+
|
103
|
+
parameter_text = WhatsappSdk::Resource::ParameterObject.new(
|
104
|
+
type: "text",
|
105
|
+
text: "I am a text"
|
106
|
+
)
|
107
|
+
|
108
|
+
header_component.add_parameter(parameter_text)
|
109
|
+
header_component.add_parameter(parameter_image)
|
110
|
+
header_component.add_parameter(parameter_video)
|
111
|
+
header_component.add_parameter(parameter_document)
|
112
|
+
header_component.to_json
|
113
|
+
|
114
|
+
body_component = WhatsappSdk::Resource::Component.new(
|
115
|
+
type: WhatsappSdk::Resource::Component::Type::BODY
|
116
|
+
)
|
117
|
+
body_component.add_parameter(parameter_text)
|
118
|
+
body_component.add_parameter(parameter_image)
|
119
|
+
body_component.add_parameter(parameter_video)
|
120
|
+
body_component.add_parameter(parameter_document)
|
121
|
+
body_component.to_json
|
122
|
+
|
123
|
+
button_component_1 = WhatsappSdk::Resource::Component.new(
|
124
|
+
type: WhatsappSdk::Resource::Component::Type::BUTTON,
|
125
|
+
index: 0,
|
126
|
+
sub_type: WhatsappSdk::Resource::Component::Subtype::QUICK_REPLY,
|
127
|
+
parameters: [WhatsappSdk::Resource::ButtonParameter.new(type: "payload", payload: "payload")]
|
128
|
+
)
|
129
|
+
|
130
|
+
button_component_2 = WhatsappSdk::Resource::Component.new(
|
131
|
+
type: WhatsappSdk::Resource::Component::Type::BUTTON,
|
132
|
+
index: 1,
|
133
|
+
sub_type: WhatsappSdk::Resource::Component::Subtype::QUICK_REPLY,
|
134
|
+
parameters: [WhatsappSdk::Resource::ButtonParameter.new(type: "payload", payload: "payload")]
|
135
|
+
)
|
136
|
+
|
137
|
+
# make sure that the template was created
|
138
|
+
response_with_json = messages_api.send_template(
|
139
|
+
sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, name: "hello_world", language: "en_US",
|
140
|
+
components_json: [
|
141
|
+
{
|
142
|
+
"type": "header",
|
143
|
+
"parameters": [
|
144
|
+
{
|
145
|
+
"type": "image",
|
146
|
+
"image": {
|
147
|
+
"link": "https://www.google.com/imgres?imgurl=https%3A%2F%2Fqph.cf2.quoracdn.net%2Fmain-qimg-6d977408fdd90a09a1fee7ba9e2f777c-lq&imgrefurl=https%3A%2F%2Fwww.quora.com%2FHow-can-I-find-my-WhatsApp-ID&tbnid=lDAx1vzXwqCakM&vet=12ahUKEwjKupLviJX4AhVrrHIEHQpGD9MQMygAegUIARC9AQ..i&docid=s-DNQVCrZmhJYM&w=602&h=339&q=example%20whatsapp%20image%20id&ved=2ahUKEwjKupLviJX4AhVrrHIEHQpGD9MQMygAegUIARC9AQ"
|
148
|
+
}
|
149
|
+
}
|
150
|
+
]
|
151
|
+
}
|
152
|
+
]
|
153
|
+
)
|
154
|
+
puts response_with_json
|
155
|
+
|
156
|
+
response_with_object = messages_api.send_template(
|
157
|
+
sender_id: SENDER_ID, recipient_number: RECIPIENT_NUMBER, name: "hello_world", language: "en_US",
|
158
|
+
components: [header_component, body_component, button_component_1, button_component_2]
|
159
|
+
)
|
160
|
+
puts response_with_object
|
data/lib/version.rb
CHANGED
@@ -25,7 +25,7 @@ module WhatsappSdk
|
|
25
25
|
params = {
|
26
26
|
messaging_product: "whatsapp",
|
27
27
|
to: recipient_number,
|
28
|
-
|
28
|
+
recipient_type: "individual",
|
29
29
|
type: "text",
|
30
30
|
"text": { body: message }
|
31
31
|
}
|
@@ -51,7 +51,7 @@ module WhatsappSdk
|
|
51
51
|
params = {
|
52
52
|
messaging_product: "whatsapp",
|
53
53
|
to: recipient_number,
|
54
|
-
|
54
|
+
recipient_type: "individual",
|
55
55
|
type: "location",
|
56
56
|
"location": {
|
57
57
|
"longitude": longitude,
|
@@ -83,7 +83,7 @@ module WhatsappSdk
|
|
83
83
|
params = {
|
84
84
|
messaging_product: "whatsapp",
|
85
85
|
to: recipient_number,
|
86
|
-
|
86
|
+
recipient_type: "individual",
|
87
87
|
type: "image"
|
88
88
|
}
|
89
89
|
params[:image] = if link
|
@@ -113,7 +113,7 @@ module WhatsappSdk
|
|
113
113
|
params = {
|
114
114
|
messaging_product: "whatsapp",
|
115
115
|
to: recipient_number,
|
116
|
-
|
116
|
+
recipient_type: "individual",
|
117
117
|
type: "audio"
|
118
118
|
}
|
119
119
|
params[:audio] = link ? { link: link } : { id: audio_id }
|
@@ -140,7 +140,7 @@ module WhatsappSdk
|
|
140
140
|
params = {
|
141
141
|
messaging_product: "whatsapp",
|
142
142
|
to: recipient_number,
|
143
|
-
|
143
|
+
recipient_type: "individual",
|
144
144
|
type: "video"
|
145
145
|
}
|
146
146
|
params[:video] = if link
|
@@ -171,7 +171,7 @@ module WhatsappSdk
|
|
171
171
|
params = {
|
172
172
|
messaging_product: "whatsapp",
|
173
173
|
to: recipient_number,
|
174
|
-
|
174
|
+
recipient_type: "individual",
|
175
175
|
type: "document"
|
176
176
|
}
|
177
177
|
params[:document] = if link
|
@@ -200,7 +200,7 @@ module WhatsappSdk
|
|
200
200
|
params = {
|
201
201
|
messaging_product: "whatsapp",
|
202
202
|
to: recipient_number,
|
203
|
-
|
203
|
+
recipient_type: "individual",
|
204
204
|
type: "sticker"
|
205
205
|
}
|
206
206
|
params[:sticker] = link ? { link: link } : { id: sticker_id }
|
@@ -225,7 +225,7 @@ module WhatsappSdk
|
|
225
225
|
params = {
|
226
226
|
messaging_product: "whatsapp",
|
227
227
|
to: recipient_number,
|
228
|
-
|
228
|
+
recipient_type: "individual",
|
229
229
|
type: "contacts"
|
230
230
|
}
|
231
231
|
params[:contacts] = contacts ? contacts.map(&:to_h) : contacts_json
|
@@ -267,7 +267,50 @@ module WhatsappSdk
|
|
267
267
|
params: params
|
268
268
|
)
|
269
269
|
|
270
|
-
WhatsappSdk::Api::Response.new(
|
270
|
+
WhatsappSdk::Api::Response.new(
|
271
|
+
response: response,
|
272
|
+
class_type: WhatsappSdk::Api::Responses::ReadMessageDataResponse
|
273
|
+
)
|
274
|
+
end
|
275
|
+
|
276
|
+
# Send template
|
277
|
+
#
|
278
|
+
# @param sender_id [Integer] Sender' phone number.
|
279
|
+
# @param recipient_number [Integer] Recipient' Phone number.
|
280
|
+
# @param name [String] the template's name.
|
281
|
+
# @param language [String] template language.
|
282
|
+
# @param components [Component] Component.
|
283
|
+
# @param components_json [Json] The component as a Json. If you pass components_json, you can't pass components.
|
284
|
+
# @return [WhatsappSdk::Api::Response] Response object.
|
285
|
+
def send_template(sender_id:, recipient_number:, name:, language:, components: nil, components_json: nil)
|
286
|
+
raise MissingArgumentError, "components or components_json is required" if !components && !components_json
|
287
|
+
|
288
|
+
params = {
|
289
|
+
messaging_product: "whatsapp",
|
290
|
+
recipient_type: "individual",
|
291
|
+
to: recipient_number,
|
292
|
+
type: "template",
|
293
|
+
template: {
|
294
|
+
name: name
|
295
|
+
}
|
296
|
+
}
|
297
|
+
|
298
|
+
params[:template][:language] = { code: language } if language
|
299
|
+
params[:template][:components] = if components.nil?
|
300
|
+
components_json
|
301
|
+
else
|
302
|
+
components.map(&:to_json)
|
303
|
+
end
|
304
|
+
|
305
|
+
response = send_request(
|
306
|
+
endpoint: endpoint(sender_id),
|
307
|
+
params: params
|
308
|
+
)
|
309
|
+
|
310
|
+
WhatsappSdk::Api::Response.new(
|
311
|
+
response: response,
|
312
|
+
class_type: WhatsappSdk::Api::Responses::MessageDataResponse
|
313
|
+
)
|
271
314
|
end
|
272
315
|
|
273
316
|
private
|
@@ -3,6 +3,7 @@
|
|
3
3
|
require_relative "responses/message_data_response"
|
4
4
|
require_relative "responses/phone_number_data_response"
|
5
5
|
require_relative "responses/phone_numbers_data_response"
|
6
|
+
require_relative "responses/read_message_data_response"
|
6
7
|
require_relative "responses/error_response"
|
7
8
|
|
8
9
|
module WhatsappSdk
|
@@ -14,7 +15,7 @@ module WhatsappSdk
|
|
14
15
|
message_data_response: Responses::MessageDataResponse,
|
15
16
|
phone_number_data_response: Responses::PhoneNumberDataResponse,
|
16
17
|
phone_numbers_data_response: Responses::PhoneNumbersDataResponse,
|
17
|
-
read_message_data_response: ReadMessageDataResponse
|
18
|
+
read_message_data_response: Responses::ReadMessageDataResponse
|
18
19
|
}.freeze
|
19
20
|
|
20
21
|
def initialize(response:, class_type:)
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WhatsappSdk
|
4
|
+
module Resource
|
5
|
+
class ButtonParameter
|
6
|
+
class InvalidType < StandardError
|
7
|
+
attr_accessor :message
|
8
|
+
|
9
|
+
def initialize(type)
|
10
|
+
@message = "invalid type #{type}. type should be text or payload"
|
11
|
+
super
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns the button parameter type.
|
16
|
+
#
|
17
|
+
# @returns type [String] Valid options are payload and text.
|
18
|
+
attr_accessor :type
|
19
|
+
|
20
|
+
module Type
|
21
|
+
TEXT = "text"
|
22
|
+
PAYLOAD = "payload"
|
23
|
+
|
24
|
+
VALID_TYPES = [PAYLOAD, TEXT].freeze
|
25
|
+
end
|
26
|
+
|
27
|
+
# Required for quick_reply buttons.
|
28
|
+
# Returns the button payload. Developer-defined payload that is returned when the button is clicked
|
29
|
+
# in addition to the display text on the button.
|
30
|
+
#
|
31
|
+
# @returns payload [String]
|
32
|
+
attr_accessor :payload
|
33
|
+
|
34
|
+
# Required for URL buttons.
|
35
|
+
# Developer-provided suffix that is appended to the predefined prefix URL in the template.
|
36
|
+
#
|
37
|
+
# @returns text [String]
|
38
|
+
attr_accessor :text
|
39
|
+
|
40
|
+
def initialize(type:, payload: nil, text: nil)
|
41
|
+
@type = type
|
42
|
+
@payload = payload
|
43
|
+
@text = text
|
44
|
+
validate
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_json(*_args)
|
48
|
+
json = {
|
49
|
+
type: type
|
50
|
+
}
|
51
|
+
json[:payload] = payload if payload
|
52
|
+
json[:text] = text if text
|
53
|
+
json
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def validate
|
59
|
+
return if Type::VALID_TYPES.include?(type)
|
60
|
+
|
61
|
+
raise InvalidType, type
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WhatsappSdk
|
4
|
+
module Resource
|
5
|
+
class Component
|
6
|
+
class InvalidField < StandardError
|
7
|
+
attr_reader :field, :message
|
8
|
+
|
9
|
+
def initialize(field, message)
|
10
|
+
@field = field
|
11
|
+
@message = message
|
12
|
+
super(message)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module Type
|
17
|
+
HEADER = 'header'
|
18
|
+
BODY = 'body'
|
19
|
+
BUTTON = 'button'
|
20
|
+
end
|
21
|
+
|
22
|
+
module Subtype
|
23
|
+
QUICK_REPLY = "quick_reply"
|
24
|
+
URL = "url"
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns the Component type.
|
28
|
+
#
|
29
|
+
# @returns type [String]. Supported Options are header, body and button.
|
30
|
+
attr_accessor :type
|
31
|
+
|
32
|
+
# Returns the parameters of the component. For button type, it's required.
|
33
|
+
#
|
34
|
+
# @returns parameter [Array<ButtonParameter, ParameterObject>] .
|
35
|
+
attr_accessor :parameters
|
36
|
+
|
37
|
+
# Returns the Type of button to create. Required when type=button. Not used for the other types.
|
38
|
+
# Supported Options
|
39
|
+
# quick_reply: Refers to a previously created quick reply button
|
40
|
+
# that allows for the customer to return a predefined message.
|
41
|
+
# url: Refers to a previously created button that allows the customer to visit the URL generated by
|
42
|
+
# appending the text parameter to the predefined prefix URL in the template.
|
43
|
+
#
|
44
|
+
# @returns subtype [String]. Valid options are quick_reply and url.
|
45
|
+
attr_accessor :sub_type
|
46
|
+
|
47
|
+
# Required when type=button. Not used for the other types.
|
48
|
+
# Position index of the button. You can have up to 3 buttons using index values of 0 to 2.
|
49
|
+
#
|
50
|
+
# @returns index [Integer].
|
51
|
+
attr_accessor :index
|
52
|
+
|
53
|
+
def add_parameter(parameter)
|
54
|
+
@parameters << parameter
|
55
|
+
end
|
56
|
+
|
57
|
+
def initialize(type:, parameters: [], sub_type: nil, index: nil)
|
58
|
+
@parameters = parameters
|
59
|
+
@type = type
|
60
|
+
@sub_type = sub_type
|
61
|
+
@index = index.nil? && type == Type::BUTTON ? 0 : index
|
62
|
+
validate_fields
|
63
|
+
end
|
64
|
+
|
65
|
+
def to_json(*_args)
|
66
|
+
json = {
|
67
|
+
type: type,
|
68
|
+
parameters: parameters.map(&:to_json)
|
69
|
+
}
|
70
|
+
json[:sub_type] = sub_type if sub_type
|
71
|
+
json[:index] = index if index
|
72
|
+
json
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def validate_fields
|
78
|
+
return if type == Type::BUTTON
|
79
|
+
raise InvalidField.new(:sub_type, 'sub_type is not required when type is not button') if sub_type
|
80
|
+
|
81
|
+
raise InvalidField.new(:index, 'index is not required when type is not button') if index
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WhatsappSdk
|
4
|
+
module Resource
|
5
|
+
class Currency
|
6
|
+
# Returns default text if localization fails.
|
7
|
+
#
|
8
|
+
# @returns fallback_value [String].
|
9
|
+
attr_accessor :fallback_value
|
10
|
+
|
11
|
+
# Currency code as defined in ISO 4217.
|
12
|
+
#
|
13
|
+
# @returns code [String].
|
14
|
+
attr_accessor :code
|
15
|
+
|
16
|
+
# Amount multiplied by 1000.
|
17
|
+
#
|
18
|
+
# @returns code [Float].
|
19
|
+
attr_accessor :amount
|
20
|
+
|
21
|
+
def initialize(fallback_value:, code:, amount:)
|
22
|
+
@fallback_value = fallback_value
|
23
|
+
@code = code
|
24
|
+
@amount = amount
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_json(*_args)
|
28
|
+
{
|
29
|
+
fallback_value: fallback_value,
|
30
|
+
code: code,
|
31
|
+
amount_1000: amount
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WhatsappSdk
|
4
|
+
module Resource
|
5
|
+
class DateTime
|
6
|
+
# Returns default text if localization fails.
|
7
|
+
#
|
8
|
+
# @returns fallback_value [String].
|
9
|
+
attr_accessor :fallback_value
|
10
|
+
|
11
|
+
def initialize(fallback_value:)
|
12
|
+
@fallback_value = fallback_value
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_json(*_args)
|
16
|
+
{
|
17
|
+
fallback_value: fallback_value
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WhatsappSdk
|
4
|
+
module Resource
|
5
|
+
class Media
|
6
|
+
class InvalidMedia < StandardError
|
7
|
+
attr_reader :field, :message
|
8
|
+
|
9
|
+
def initialize(field, message)
|
10
|
+
@field = field
|
11
|
+
@message = message
|
12
|
+
super(message)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns media id.
|
17
|
+
#
|
18
|
+
# @returns id [String].
|
19
|
+
attr_accessor :id
|
20
|
+
|
21
|
+
module Type
|
22
|
+
AUDIO = 'audio'
|
23
|
+
DOCUMENT = 'document'
|
24
|
+
IMAGE = 'image'
|
25
|
+
VIDEO = 'video'
|
26
|
+
STICKER = 'sticker'
|
27
|
+
|
28
|
+
VALID_TYPES = [AUDIO, DOCUMENT, IMAGE, VIDEO, STICKER].freeze
|
29
|
+
end
|
30
|
+
|
31
|
+
# @returns type [String]. Valid options ar audio, document, image, video and sticker.
|
32
|
+
attr_accessor :type
|
33
|
+
|
34
|
+
# The protocol and URL of the media to be sent. Use only with HTTP/HTTPS URLs.
|
35
|
+
# Do not use this field when the message type is set to text.
|
36
|
+
#
|
37
|
+
# @returns link [String].
|
38
|
+
attr_accessor :link
|
39
|
+
|
40
|
+
# Describes the specified document or image media.
|
41
|
+
#
|
42
|
+
# @returns caption [String].
|
43
|
+
attr_accessor :caption
|
44
|
+
|
45
|
+
# Describes the filename for the specific document. Use only with document media.
|
46
|
+
#
|
47
|
+
# @returns filename [String].
|
48
|
+
attr_accessor :filename
|
49
|
+
|
50
|
+
def initialize(type:, id: nil, link: nil, caption: nil, filename: nil)
|
51
|
+
@type = type
|
52
|
+
@id = id
|
53
|
+
@link = link
|
54
|
+
@caption = caption
|
55
|
+
@filename = filename
|
56
|
+
validate_media
|
57
|
+
end
|
58
|
+
|
59
|
+
def to_json(*_args)
|
60
|
+
json = {}
|
61
|
+
json[:id] = id unless id.nil?
|
62
|
+
json[:link] = link unless link.nil?
|
63
|
+
json[:caption] = caption unless caption.nil?
|
64
|
+
json[:filename] = filename unless filename.nil?
|
65
|
+
json
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def validate_media
|
71
|
+
unless Type::VALID_TYPES.include?(type)
|
72
|
+
raise InvalidMedia.new(:type, "invalid type. type should be audio, document, image, video or sticker")
|
73
|
+
end
|
74
|
+
if filename && (type != Type::DOCUMENT)
|
75
|
+
raise InvalidMedia.new(:filename, "filename can only be used with document")
|
76
|
+
end
|
77
|
+
|
78
|
+
if caption && !(type == Type::DOCUMENT || type == Type::IMAGE)
|
79
|
+
raise InvalidMedia.new(:caption, "caption can only be used with document or image")
|
80
|
+
end
|
81
|
+
|
82
|
+
true
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WhatsappSdk
|
4
|
+
module Resource
|
5
|
+
class ParameterObject
|
6
|
+
class InvalidType < StandardError
|
7
|
+
attr_accessor :message
|
8
|
+
|
9
|
+
def initialize(type)
|
10
|
+
@message = "invalid type #{type}. type should be text, currency, date_time, image, document or video"
|
11
|
+
super
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class MissingValue < StandardError
|
16
|
+
attr_reader :field, :message
|
17
|
+
|
18
|
+
def initialize(field, message)
|
19
|
+
@field = field
|
20
|
+
@message = message
|
21
|
+
super(message)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns the parameter type.
|
26
|
+
#
|
27
|
+
# @returns type [String] Valid options are text, currency, date_time, image, document, video.
|
28
|
+
attr_accessor :type
|
29
|
+
|
30
|
+
module Type
|
31
|
+
TEXT = "text"
|
32
|
+
CURRENCY = "currency"
|
33
|
+
DATE_TIME = "date_time"
|
34
|
+
IMAGE = "image"
|
35
|
+
DOCUMENT = "document"
|
36
|
+
VIDEO = "video"
|
37
|
+
|
38
|
+
VALID_TYPES = [TEXT, CURRENCY, DATE_TIME, IMAGE, DOCUMENT, VIDEO].freeze
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns Text string if the parameter object type is text.
|
42
|
+
# For the header component, the character limit is 60 characters.
|
43
|
+
# For the body component, the character limit is 1024 characters.
|
44
|
+
#
|
45
|
+
# @returns text [String]
|
46
|
+
attr_accessor :text
|
47
|
+
|
48
|
+
# Returns Currency if the parameter object type is currency.
|
49
|
+
#
|
50
|
+
# @returns currency [Currency]
|
51
|
+
attr_accessor :currency
|
52
|
+
|
53
|
+
# Returns date_time if the parameter object type is date_time.
|
54
|
+
#
|
55
|
+
# @returns date_time [DateTime]
|
56
|
+
attr_accessor :date_time
|
57
|
+
|
58
|
+
# Returns image if the parameter object type is image.
|
59
|
+
#
|
60
|
+
# @returns image [Media]
|
61
|
+
attr_accessor :image
|
62
|
+
|
63
|
+
# Returns document if the parameter object type is document.
|
64
|
+
#
|
65
|
+
# @returns document [Media]
|
66
|
+
attr_accessor :document
|
67
|
+
|
68
|
+
# Returns video if the parameter object type is video.
|
69
|
+
#
|
70
|
+
# @returns video [Media]
|
71
|
+
attr_accessor :video
|
72
|
+
|
73
|
+
def initialize(type:, text: nil, currency: nil, date_time: nil, image: nil, document: nil, video: nil)
|
74
|
+
@type = type
|
75
|
+
@text = text
|
76
|
+
@currency = currency
|
77
|
+
@date_time = date_time
|
78
|
+
@image = image
|
79
|
+
@document = document
|
80
|
+
@video = video
|
81
|
+
validate
|
82
|
+
end
|
83
|
+
|
84
|
+
def to_json(*_args)
|
85
|
+
json = { type: type }
|
86
|
+
json[type.to_sym] = case type
|
87
|
+
when "text"
|
88
|
+
text
|
89
|
+
when "currency"
|
90
|
+
currency.to_json
|
91
|
+
when "date_time"
|
92
|
+
date_time.to_json
|
93
|
+
when "image"
|
94
|
+
image.to_json
|
95
|
+
when "document"
|
96
|
+
document.to_json
|
97
|
+
when "video"
|
98
|
+
video.to_json
|
99
|
+
else
|
100
|
+
raise "Invalid type: #{type}"
|
101
|
+
end
|
102
|
+
|
103
|
+
json
|
104
|
+
end
|
105
|
+
|
106
|
+
private
|
107
|
+
|
108
|
+
def validate
|
109
|
+
validate_attributes
|
110
|
+
validate_type
|
111
|
+
end
|
112
|
+
|
113
|
+
def validate_type
|
114
|
+
return if Type::VALID_TYPES.include?(type)
|
115
|
+
|
116
|
+
raise InvalidType, type
|
117
|
+
end
|
118
|
+
|
119
|
+
def validate_attributes
|
120
|
+
[
|
121
|
+
[:text, text],
|
122
|
+
[:currency, currency],
|
123
|
+
[:date_time, date_time],
|
124
|
+
[:image, image],
|
125
|
+
[:document, document],
|
126
|
+
[:video, video]
|
127
|
+
].each do |type_sym, value|
|
128
|
+
next unless type == type_sym
|
129
|
+
raise MissingValue.new(type, "#{type} is required when the type is #{type}") if value.nil?
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
data/lib/whatsapp_sdk.rb
CHANGED
@@ -11,14 +11,21 @@ require_relative "whatsapp_sdk/api/responses/phone_number_data_response"
|
|
11
11
|
require_relative "whatsapp_sdk/api/responses/phone_numbers_data_response"
|
12
12
|
require_relative "whatsapp_sdk/api/responses/error_response"
|
13
13
|
require_relative "whatsapp_sdk/api/responses/data_response"
|
14
|
+
require_relative "whatsapp_sdk/api/responses/read_message_data_response"
|
14
15
|
|
15
16
|
# Resources
|
16
17
|
require_relative "whatsapp_sdk/resource/address"
|
18
|
+
require_relative "whatsapp_sdk/resource/button_parameter"
|
19
|
+
require_relative "whatsapp_sdk/resource/component"
|
17
20
|
require_relative "whatsapp_sdk/resource/contact_response"
|
18
21
|
require_relative "whatsapp_sdk/resource/contact"
|
22
|
+
require_relative "whatsapp_sdk/resource/currency"
|
23
|
+
require_relative "whatsapp_sdk/resource/date_time"
|
19
24
|
require_relative "whatsapp_sdk/resource/email"
|
25
|
+
require_relative "whatsapp_sdk/resource/media"
|
20
26
|
require_relative "whatsapp_sdk/resource/message"
|
21
27
|
require_relative "whatsapp_sdk/resource/name"
|
22
28
|
require_relative "whatsapp_sdk/resource/org"
|
29
|
+
require_relative "whatsapp_sdk/resource/parameter_object"
|
23
30
|
require_relative "whatsapp_sdk/resource/phone_number"
|
24
31
|
require_relative "whatsapp_sdk/resource/url"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: whatsapp_sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ignacio-chiazzo
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-06-
|
11
|
+
date: 2022-06-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -102,6 +102,7 @@ files:
|
|
102
102
|
- Rakefile
|
103
103
|
- bin/console
|
104
104
|
- bin/setup
|
105
|
+
- example.rb
|
105
106
|
- lib/version.rb
|
106
107
|
- lib/whatsapp_sdk.rb
|
107
108
|
- lib/whatsapp_sdk/api/client.rb
|
@@ -117,12 +118,18 @@ files:
|
|
117
118
|
- lib/whatsapp_sdk/api/responses/read_message_data_response.rb
|
118
119
|
- lib/whatsapp_sdk/error.rb
|
119
120
|
- lib/whatsapp_sdk/resource/address.rb
|
121
|
+
- lib/whatsapp_sdk/resource/button_parameter.rb
|
122
|
+
- lib/whatsapp_sdk/resource/component.rb
|
120
123
|
- lib/whatsapp_sdk/resource/contact.rb
|
121
124
|
- lib/whatsapp_sdk/resource/contact_response.rb
|
125
|
+
- lib/whatsapp_sdk/resource/currency.rb
|
126
|
+
- lib/whatsapp_sdk/resource/date_time.rb
|
122
127
|
- lib/whatsapp_sdk/resource/email.rb
|
128
|
+
- lib/whatsapp_sdk/resource/media.rb
|
123
129
|
- lib/whatsapp_sdk/resource/message.rb
|
124
130
|
- lib/whatsapp_sdk/resource/name.rb
|
125
131
|
- lib/whatsapp_sdk/resource/org.rb
|
132
|
+
- lib/whatsapp_sdk/resource/parameter_object.rb
|
126
133
|
- lib/whatsapp_sdk/resource/phone_number.rb
|
127
134
|
- lib/whatsapp_sdk/resource/url.rb
|
128
135
|
- whatsapp_sdk.gemspec
|