viberroo 0.3.1 → 0.3.4

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: cfdd2b9cf561f8fe620e7e8fd58c646aded156836519095de599f794022c5771
4
- data.tar.gz: 394fcb5010e801f8595c2fe33cb5f28d72e95d961a7cf13cb33b8d006dc59a86
3
+ metadata.gz: 8680e2cafc78f601457863ee3ea61012d102da14d025c232847c0d0f96a391f5
4
+ data.tar.gz: 5387376c93d2aef3a23707eb936094d07f4c0e93407b116b616ab639b6f6020d
5
5
  SHA512:
6
- metadata.gz: 155014f7f40d8730f9ad41c9193dd739caa33b906587e0ff4ba6ed2fe7e3890841c12eff617ec7951cceaecca1923cbb59f5a6eecb24a9bf7ff3a664a4f582ac
7
- data.tar.gz: 7baf397be2823482dc211c0c3392f3c8bedf981da346e06dc9dae91d41e27db0ce7feb5afdf4d151a65e67bdf9d3a003389cc7ee077123d9dc7f371efa0ee4df
6
+ metadata.gz: cda037c2fab0c148db8aff216ebbe414239e05c648bc28f3324dd9d35b73e343da61fc9b8cbbcd61add30f3320ba6fdaebccea866f0a63d6b4630e3caeede862
7
+ data.tar.gz: a4b5427873cc6bf1eb2ca81e8965a54052dc1d01715e19e0928972c0fb0f5be3d700457885027ab08b42d62056bbf14bdc08624bc197554257347e6fb32b309d
data/lib/viberroo/bot.rb CHANGED
@@ -1,12 +1,34 @@
1
1
  require 'net/http'
2
2
  require 'uri'
3
3
 
4
- # Namespace for all Viberroo code.
5
4
  module Viberroo
6
-
7
- # Used for sending requests to Viber API. Each request sends a http POST request to a particular endpoint, each returns http response.
5
+ ##
6
+ # This class represents a server bot/client which communicates to Viber API. Each request sends a http POST request to a particular endpoint, each returns either http response, or parsed response body as specified in configuration.
7
+ #
8
+ # @see Configuration
9
+ #
8
10
  class Bot
9
- def initialize(token: nil, response: nil)
11
+ ##
12
+ # @example Initializing
13
+ # class ViberController < ApplicationController
14
+ # skip_before_action :verify_authenticity_token
15
+ #
16
+ # def callback
17
+ # @response = Viberroo::Response.new(params.permit!)
18
+ # @bot = Viberroo::Bot.new(response: @response)
19
+ #
20
+ # head :ok
21
+ # end
22
+ # end
23
+ #
24
+ # @param [Response] response **Required**. A callback response.
25
+ # @param [String] token **Optional**. Normally should be provided by `Viberroo.configure.auth_token` but is available here as a shortcut when predefined configuration is undesirable. Takes precedence over `Viberroo.configure.auth_token`.
26
+ #
27
+ # @see Response
28
+ # @see Configuration
29
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#authentication-token
30
+ #
31
+ def initialize(response: Response.new({}), token: nil)
10
32
  Viberroo.configure
11
33
 
12
34
  @headers = {
@@ -16,45 +38,194 @@ module Viberroo
16
38
  @response = response
17
39
  end
18
40
 
19
- # Used to set bot webhook.
41
+ ##
42
+ # Sets a webhook by making a request to `/set_webhook`. Necessary for receiving callbacks from Viber.
43
+ # For security reasons only URLs with valid and official SSL certificate from a trusted CA will be allowed. `ngrok` is a good workaround for development convenience.
44
+ #
45
+ # @example Setup webhook with rake task
46
+ # namespace :viber do
47
+ # task set_webhook: :environment do
48
+ # Viberroo::Bot.new.set_webhook(
49
+ # url: 'https://<your_ngrok_public_address>/viber',
50
+ # event_types: %w[conversation_started subscribed unsubscribed],
51
+ # send_name: true,
52
+ # send_photo: true
53
+ # )
54
+ # end
55
+ # end
56
+ #
57
+ # @param [String] url **Required**. HTTPs callback URL.
58
+ # @param [Array] event_types **Optional**. Indicates the types of Viber events that the bot will receive. Leaving this parameter out will include all events. **API default**: `%w[delivered seen failed subscribed unsubscribed conversation_started]`.
59
+ # @param [true, false] send_name **Optional**. Indicates whether or not the bot should receive the user name. **API default**: `false`.
60
+ # @param [true, false] send_photo **Optional**. Indicates whether or not the bot should receive the user photo. **API default**: `false`.
61
+ #
62
+ # @return [Net::HTTPResponse || Hash]
63
+ #
64
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#webhooks
65
+ #
20
66
  def set_webhook(url:, event_types: nil, send_name: nil, send_photo: nil)
21
67
  request(URL::WEBHOOK, url: url, event_types: event_types,
22
- send_name: send_name, send_photo: send_photo)
68
+ send_name: send_name, send_photo: send_photo)
23
69
  end
24
70
 
25
- # Used to remove bot webhook.
71
+ ##
72
+ # Removes a webhook by making a request to `/set_webhook`.
73
+ #
74
+ # @example Remove webhook with rake task
75
+ # namespace :viber do
76
+ # task remove_webhook: :environment do
77
+ # Viberroo::Bot.new.remove_webhook
78
+ # end
79
+ # end
80
+ #
81
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#removing-your-webhook
82
+ #
83
+ # @return [Net::HTTPResponse || Hash]
84
+ #
26
85
  def remove_webhook
27
86
  request(URL::WEBHOOK, url: '')
28
87
  end
29
88
 
30
- # Used to send messages.
89
+ ##
90
+ # Sends a message to a user by making a request to `/send_message`.
91
+ #
92
+ # @example Send a plain message
93
+ # go_somewhere = Viberroo::Input.url_button({
94
+ # Columns: 3,
95
+ # Rows: 2,
96
+ # Text: 'Mystery link',
97
+ # ActionBody: 'somewhere.com'
98
+ # })
99
+ #
100
+ # keyboard = Viberroo::Input.keyboard(Buttons: [go_somewhere])
101
+ # message = Viberroo::Message.plain(text: 'Click if you dare.')
102
+ #
103
+ # @bot.send(message: message, keyboard: keyboard)
104
+ #
105
+ # @example Send a rich media
106
+ # search = Viberroo::Input.reply_button({
107
+ # Columns: 4,
108
+ # Rows: 3,
109
+ # ActionBody: '/search',
110
+ # Text: 'Search something...'
111
+ # }
112
+ #
113
+ # locate = Viberroo::Input.reply_button({
114
+ # Columns: 4,
115
+ # Rows: 3,
116
+ # ActionBody: '/near_me'
117
+ # }
118
+ #
119
+ # browse = Viberroo::Input.url_button({
120
+ # Columns: 4,
121
+ # Rows: 2,
122
+ # ActionBody: 'parrot.live',
123
+ # Text: 'Browse something wierd'
124
+ # }
125
+ #
126
+ # rich_message = Viberroo::Message.rich(rich_media: { ButtonsGroupColumns: 4,
127
+ # ButtonsGroupRows: 6,
128
+ # Buttons: [search, locate, browse] })
129
+ #
130
+ # @bot.send(message: rich_message)
131
+ #
132
+ # @param [Hash] message **Required**. One of the message types to send.
133
+ # @param [Hash] keyboard **Optional**. A keyboard that can be attached to a message.
134
+ #
135
+ # @return [Net::HTTPResponse || Hash]
136
+ #
137
+ # @see Message
138
+ # @see Input
139
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#send-message
140
+ # @see https://viber.github.io/docs/tools/keyboards/#buttons-parameters
141
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#keyboards
142
+ #
143
+ def send_message(message, keyboard: {})
144
+ request(URL::MESSAGE, { receiver: @response.user_id }.merge(message, keyboard))
145
+ end
146
+
147
+ # @deprecated Use {#send_message} instead.
31
148
  def send(message:, keyboard: {})
32
- request(URL::MESSAGE,
33
- { receiver: @response&.user_id }.merge(message).merge(keyboard))
149
+ Viberroo.config.logger.info(<<~WARNING)
150
+ DEPRECATION WARNING: Bot#send method is going to be removed in the next
151
+ minor release. Use Bot#send_message instead.
152
+ WARNING
153
+
154
+ send_message(message, keyboard: keyboard)
34
155
  end
35
156
 
36
- # Used to broadcast messages.
157
+ ##
158
+ # @note This request has a rate limit of 500 requests in a 10 seconds window.
159
+ #
160
+ # Broadcasts a messages to subscribed users by making a request to `/broadcast_message`.
161
+ #
162
+ # @example Broadcast simple message
163
+ # message = Viberroo::Message.plain(text: 'Howdy.')
164
+ # response = @bot.broadcast(message: message, to: ViberSubscriber.sample(500).pluck(:viber_id))
165
+ #
166
+ # @param [Hash] message **Required**. One of the message types to broadcast.
167
+ # @param [Array] to **Required**. List of user ids to broadcast to. Specified users need to be subscribed.
168
+ #
169
+ # @return [Net::HTTPResponse || Hash]
170
+ #
171
+ # @see Message
172
+ # @see Input
173
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#broadcast-message
174
+ #
37
175
  def broadcast(message:, to:)
38
176
  request(URL::BROADCAST_MESSAGE, message.merge(broadcast_list: to))
39
177
  end
40
178
 
41
- # Used to retrieve account info. These settings can be set in you Viber admin panel.
179
+ ##
180
+ # Retrieves account info by making a request to `/get_account_info`. These settings can be set in you Viber admin panel.
181
+ #
182
+ # @return [Net::HTTPResponse || Hash]
183
+ #
184
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#get-account-info
185
+ #
42
186
  def get_account_info
43
187
  request(URL::GET_ACCOUNT_INFO)
44
188
  end
45
189
 
46
- # Used to retrieve details of a particular user.
190
+ ##
191
+ # @note This request can be sent twice during a 12 hours period for each user ID.
192
+ #
193
+ #
194
+ # @example
195
+ # response = @bot.get_user_details(id: ViberSubscriber.sample.viber_id)
196
+ #
197
+ # Retrieves details of particular user by making a request to `/get_user_details`.
198
+ #
199
+ # @return [Net::HTTPResponse || Hash]
200
+ #
201
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#get-user-details
202
+ #
47
203
  def get_user_details(id:)
48
204
  request(URL::GET_USER_DETAILS, id: id)
49
205
  end
50
206
 
51
- # Used to get online of a list of subscribed users.
207
+ ##
208
+ # @note The API supports up to 100 user id per request and those users must be subscribed to the account.
209
+ #
210
+ # Retrieves a list of user status by making a request to `get_online`.
211
+ #
212
+ #
213
+ # @example
214
+ # response = @bot.get_online(ids: ViberSubscriber.sample(100).pluck(:viber_id))
215
+ #
216
+ # @param [Array] ids **Required**. List of user ids.
217
+ #
218
+ # @return [Net::HTTPResponse || Hash]
219
+ #
220
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#get-online
221
+ #
52
222
  def get_online(ids:)
53
223
  request(URL::GET_ONLINE, ids: ids)
54
224
  end
55
225
 
56
226
  private
57
227
 
228
+ # @!visibility private
58
229
  def request(url, params = {})
59
230
  uri = URI(url)
60
231
 
@@ -65,15 +236,16 @@ module Viberroo
65
236
  http.request(request)
66
237
  end
67
238
 
68
- Viberroo.config.logger&.info("##{caller_name} -- #{response.body}")
69
-
70
239
  Viberroo.config.parse_response_body ? JSON.parse(response.body) : response
71
240
  end
72
241
 
242
+ # @!visibility private
243
+ # Extends Ruby version compability from 2.4 to 2.3.
73
244
  def compact(params)
74
245
  params.delete_if { |_, v| v.nil? }
75
246
  end
76
247
 
248
+ # @!visibility private
77
249
  def caller_name
78
250
  caller[1][/`.*'/][1..-2]
79
251
  end
@@ -4,34 +4,59 @@ module Viberroo
4
4
  attr_accessor :config
5
5
  end
6
6
 
7
- # Yields the global configuration to a block. Returns existing configuration if one was defined earlier.
7
+ ##
8
+ # Yields the global configuration to a block. Returns existing configuration
9
+ # if one was defined earlier.
8
10
  # @yield [Configuration] global configuration
9
11
  #
10
12
  # @example
11
13
  # RSpec.configure do |config|
12
- # config.auth_token = 'syEsp8e0'
14
+ # config.auth_token = '445da6az1s345z78-dazcczb2542zv51a-e0vc5fva17480im9'
15
+ # config.parse_response_body = false
13
16
  # end
17
+ #
14
18
  # @see Viberroo::Configuration
19
+ #
15
20
  def self.configure
16
21
  self.config ||= Configuration.new
17
22
  yield(config) if block_given?
18
23
  end
19
24
 
25
+ ##
20
26
  # Stores runtime configuration information.
27
+ #
21
28
  class Configuration
22
- attr_accessor :logger, :auth_token, :parse_response_body
29
+ ##
30
+ # Specifies logger.
31
+ #
32
+ # @return [Logger]
33
+ attr_accessor :logger
34
+
35
+ ##
36
+ # Stores Viber API authentication token.
37
+ # Necessary for the bot to send API requests.
38
+ #
39
+ # @return [String]
40
+ #
41
+ # @see Bot#set_webhook
42
+ attr_accessor :auth_token
43
+
44
+ ##
45
+ # Specifies whether to parse response body of Bot requests.
46
+ #
47
+ # @return [true || false]
48
+ #
49
+ # @see Bot
50
+ attr_accessor :parse_response_body
23
51
 
24
52
  def initialize
25
- # Stores Viber API authentication token. Necessary for the bot to send API requests.
26
53
  @auth_token = nil
27
54
 
28
- # Specifies logger.
29
55
  @logger = Logger.new(STDOUT)
30
56
  @logger.formatter = proc do |severity, datetime, _, msg|
31
57
  "[#{datetime}] #{severity} Viberroo::Bot #{msg}\n"
32
58
  end
33
59
 
34
- # Specifies whether to parse request response body.
35
60
  @parse_response_body = true
36
61
  end
37
62
  end
@@ -1,29 +1,108 @@
1
1
  module Viberroo
2
+ ##
3
+ # This class' methods serve as declarative wrappers with predefined
4
+ # types for UI elements such as buttons and keyboards. Buttons can be combined
5
+ # with a keyboard or used in rich messages. Only basic parameters are
6
+ # specified in this documentation, to see all possibilities please consult
7
+ # official Viber API documentation.
8
+ #
9
+ # @see https://viber.github.io/docs/tools/keyboards/#general-keyboard-parameters
10
+ # @see https://viber.github.io/docs/tools/keyboards/#buttons-parameters
11
+ #
2
12
  class Input
13
+ ##
14
+ # A keyboard that can be attached to any message.
15
+ #
16
+ # @example
17
+ # go_somewhere = Viberroo::Input.url_button({
18
+ # Columns: 3,
19
+ # Rows: 2,
20
+ # Text: 'Mystery link',
21
+ # ActionBody: 'somewhere.com'
22
+ # })
23
+ #
24
+ # keyboard = Input.keyboard(Buttons: [go_somewhere])
25
+ #
26
+ # @see https://developers.viber.com/docs/tools/keyboards/#general-keyboard-parameters
27
+ #
3
28
  def self.keyboard(params)
4
29
  { keyboard: { Type: 'keyboard' }.merge(params) }
5
30
  end
6
31
 
32
+ ##
33
+ # A reply button, when tapped sends it's body as a message.
34
+ #
35
+ # @example
36
+ # button = Viberroo::Input.reply_button({
37
+ # Columns: 4,
38
+ # Rows: 3,
39
+ # ActionBody: '/search_cookies',
40
+ # Text: 'I want some cookies.'
41
+ # }
42
+ #
43
+ # @see https://developers.viber.com/docs/tools/keyboards/#buttons-parameters
44
+ #
7
45
  def self.reply_button(params)
8
46
  { ActionType: 'reply' }.merge(params)
9
47
  end
10
48
 
49
+ ##
50
+ # A URL button, when tapped opens specified URL.
51
+ #
52
+ # @example
53
+ # button = Viberroo::Input.url_button({
54
+ # Columns: 4,
55
+ # Rows: 2,
56
+ # ActionBody: 'parrot.live',
57
+ # Text: 'Browse something weird'
58
+ # }
59
+ #
60
+ # @see https://developers.viber.com/docs/tools/keyboards/#buttons-parameters
61
+ #
11
62
  def self.url_button(params)
12
63
  { ActionType: 'open-url' }.merge(params)
13
64
  end
14
65
 
66
+ ##
67
+ # @note Not supported on desktop.
68
+ #
69
+ # Location picker button, gives ability to pick a location on the map.
70
+ #
71
+ # @example
72
+ # button = Viberroo::Input.location_picker_button(location: { lat: 48.9215, lon: 24.7097 })
73
+ #
74
+ # @see https://developers.viber.com/docs/tools/keyboards/#buttons-parameters
75
+ #
15
76
  def self.location_picker_button(params)
16
77
  { ActionType: 'location-picker',
17
78
  min_api_version: 3
18
79
  }.merge(params)
19
80
  end
20
81
 
82
+ ##
83
+ # @note Not supported on desktop.
84
+ #
85
+ # Share phone button.
86
+ #
87
+ # @example
88
+ # button = Viberroo::Input.share_phone_button(contact: { name: 'Gwythyr', phone_number: '12343214' })
89
+ #
90
+ # @see https://developers.viber.com/docs/tools/keyboards/#buttons-parameters
91
+ #
21
92
  def self.share_phone_button(params)
22
93
  { ActionType: 'share-phone',
23
94
  min_api_version: 3
24
95
  }.merge(params)
25
96
  end
26
97
 
98
+ ##
99
+ # A button that does nothing, for decoration purposes.
100
+ #
101
+ # @example
102
+ # button = Viberroo::Input.none_button(Text: 'Purely decorative.')
103
+ #
104
+ # @see https://developers.viber.com/docs/tools/keyboards/#buttons-parameters
105
+ #
27
106
  def self.none_button(params = {})
28
107
  { ActionType: 'none' }.merge(params)
29
108
  end
@@ -1,37 +1,191 @@
1
1
  module Viberroo
2
+ ##
3
+ # This class' methods serve as declarative wrappers with predefined types for
4
+ # each message type Viber API offers.
5
+ #
6
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#message-types
7
+ #
2
8
  class Message
9
+ ##
10
+ # Simple text message.
11
+ #
12
+ # @example
13
+ # message = Viberroo::Message.plain(text: 'Hello there!')
14
+ #
15
+ # @param [Hash] params
16
+ # @option params [String] text **Required**.
17
+ #
18
+ # @return [Hash]
19
+ #
20
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#text-message
21
+ #
3
22
  def self.plain(params)
4
23
  { type: :text }.merge(params)
5
24
  end
6
25
 
26
+ ##
27
+ # The Rich Media message type allows sending messages with pre-defined layout,
28
+ # including height (rows number), width (columns number), text, images and buttons.
29
+ #
30
+ # @example Send a rich media
31
+ # search = Button.reply({
32
+ # Columns: 4,
33
+ # Rows: 3,
34
+ # ActionBody: '/search',
35
+ # Text: 'Search something...'
36
+ # }
37
+ #
38
+ # locate = Button.reply({
39
+ # Columns: 4,
40
+ # Rows: 3,
41
+ # ActionBody: '/near_me'
42
+ # }
43
+ #
44
+ # browse = Button.url({
45
+ # Columns: 4,
46
+ # Rows: 2,
47
+ # ActionBody: 'parrot.live',
48
+ # Text: 'Browse something wierd'
49
+ # }
50
+ #
51
+ # @bot.send_rich_media(
52
+ # rich_media: {
53
+ # ButtonsGroupColumns: 4,
54
+ # ButtonsGroupRows: 6,
55
+ # Buttons: [search, locate, browse]
56
+ # }
57
+ # )
58
+ #
59
+ # @param [Hash] params
60
+ # @option params [Hash] rich_media
61
+ # @option params [Integer] rich_media.ButtonsGroupColumns Number of columns per carousel content block. Possible values 1 - 6. **API Default**: 6.
62
+ # @option params [Integer] rich_media.ButtonsGroupRows Number of rows per carousel content block. Possible values 1 - 7. **API Default**: 7.
63
+ # @option params [Hash] rich_media.Buttons Array of buttons. Max of 6 * `ButtonsGroupColumns` * `ButtonsGroupRows`.
64
+ #
65
+ # @return [Hash]
66
+ #
67
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#rich-media-message--carousel-content-message
68
+ #
7
69
  def self.rich(params)
8
70
  { type: :rich_media, min_api_version: 2 }.merge(params)
9
71
  end
10
72
 
73
+ ##
74
+ # Location message.
75
+ #
76
+ # @example
77
+ # message = Message.location(location: { lat: '48.9215', lon: '24.7097' })
78
+ #
79
+ # @param [Hash] params
80
+ # @option params [Hash] location
81
+ # @option params [Float] location.lat **Required**. Latitude
82
+ # @option params [Float] location.lon **Required**. Longitude
83
+ #
84
+ # @return [Hash]
85
+ #
86
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#location-message
87
+ #
11
88
  def self.location(params)
12
89
  { type: :location }.merge(params)
13
90
  end
14
91
 
92
+ ##
93
+ # Picture message.
94
+ #
95
+ # @note Max image size: 1MB on iOS, 3MB on Android.
96
+ #
97
+ # @param [Hash] params
98
+ # @option params [String] media **Required**. Image URL. Allowed extensions: .jpeg, .png .gif. Animated GIFs can be sent as URL messages or file messages.
99
+ # @option params [String] text **Optional**. Max 120 characters.
100
+ # @option params [String] thumbnail **Optional**. Thumbnail URL. Max size 100 kb. Recommended: 400x400.
101
+ #
102
+ # @return [Hash]
103
+ #
104
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#picture-message
105
+ #
15
106
  def self.picture(params = {})
16
107
  { type: :picture, text: '' }.merge(params)
17
108
  end
18
109
 
110
+ ##
111
+ # Video message.
112
+ #
113
+ # @note Max video size is 26MB.
114
+ #
115
+ # @param [Hash] params
116
+ # @option params [String] media **Required**. URL of the video (MP4, H264). Only MP4 and H264 are supported.
117
+ # @option params [Integer] size **Required**. Size of the video in bytes.
118
+ # @option params [Integer] duration **Optional**. Duration in seconds. Max value - 180.
119
+ # @option params [String] thumbnail **Optional**. Thumbnail URL. Max size 100 kb. Recommended: 400x400. Only JPEG format is supported.
120
+ #
121
+ # @return [Hash]
122
+ #
123
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#video-message
124
+ #
19
125
  def self.video(params = {})
20
126
  { type: :video }.merge(params)
21
127
  end
22
128
 
129
+ ##
130
+ # File message.
131
+ #
132
+ # @note Max file size is 50MB.
133
+ #
134
+ # @param [Hash] params
135
+ # @option params [String] media **Required**. File URL.
136
+ # @option params [Integer] size **Required**. File size in bytes.
137
+ # @option params [String] file_name **Required**. Name of the file, should include extension. Max 256 characters (including extension).
138
+ #
139
+ # @return [Hash]
140
+ #
141
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#file-message
142
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#forbiddenFileFormats
143
+ #
23
144
  def self.file(params = {})
24
145
  { type: :file }.merge(params)
25
146
  end
26
147
 
148
+ ##
149
+ # Contact message.
150
+ #
151
+ # @param [Hash] params
152
+ # @option params [Hash] contact
153
+ # @option params [Float] contact.name **Required**. Name of the contact. Max 28 characters.
154
+ # @option params [Float] contact.phone_number **Required**. Phone number of the contact. Max 18 characters.
155
+ #
156
+ # @return [Hash]
157
+ #
158
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#contact-message
159
+ #
27
160
  def self.contact(params = {})
28
161
  { type: :contact }.merge(params)
29
162
  end
30
163
 
164
+ ##
165
+ # URL message.
166
+ #
167
+ # @param [Hash] params
168
+ # @option params [String] media **Required**. Max 2000 characters.
169
+ #
170
+ # @return [Hash]
171
+ #
172
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#url-message
173
+ #
31
174
  def self.url(params = {})
32
175
  { type: :url }.merge(params)
33
176
  end
34
177
 
178
+ ##
179
+ # Sticker message.
180
+ #
181
+ # @param [Hash] params
182
+ # @option params [Integer] sticker_id **Required**. Max 2000 characters.
183
+ #
184
+ # @return [Hash]
185
+ #
186
+ # @see https://developers.viber.com/docs/api/rest-bot-api/#sticker-message
187
+ # @see https://developers.viber.com/docs/tools/sticker-ids/
188
+ #
35
189
  def self.sticker(params = {})
36
190
  { type: :sticker }.merge(params)
37
191
  end
@@ -1,13 +1,40 @@
1
1
  require 'recursive-open-struct'
2
2
 
3
3
  module Viberroo
4
+ ##
5
+ # Wraps callback response and provides helper methods for easier parameter
6
+ # access.
4
7
  class Response
8
+
9
+ ##
10
+ # Accessor for response parameters.
5
11
  attr_reader :params
6
12
 
13
+ ##
14
+ # @example
15
+ # class ViberController < ApplicationController
16
+ # skip_before_action :verify_authenticity_token
17
+ #
18
+ # def callback
19
+ # @response = Viberroo::Response.new(params.permit!)
20
+ # @bot = Viberroo::Bot.new(response: @response)
21
+ #
22
+ # head :ok
23
+ # end
24
+ # end
25
+ #
26
+ # @param [Hash] params Parameters from API callback.
27
+ #
7
28
  def initialize(params)
8
- @params = RecursiveOpenStruct.new params.to_h
29
+ @params = RecursiveOpenStruct.new(params.to_h)
9
30
  end
10
31
 
32
+ ##
33
+ # Unifies user id access. Different callback events return user id differently.
34
+ # This method unifies user id access interface based on callback event type.
35
+ # Original user id params remain available in `params` attribute reader.
36
+ # @return [Integer || nil]
37
+ #
11
38
  def user_id
12
39
  case @params.event
13
40
  when 'conversation_started', 'subscribed'
@@ -1,3 +1,3 @@
1
1
  module Viberroo
2
- VERSION = '0.3.1'.freeze
2
+ VERSION = '0.3.4'.freeze
3
3
  end
data/lib/viberroo.rb CHANGED
@@ -6,7 +6,13 @@ require 'viberroo/response'
6
6
  require 'viberroo/bot'
7
7
  require 'logger'
8
8
 
9
+ ##
10
+ # Top namespace for all Viberroo code.
11
+ #
9
12
  module Viberroo
13
+ ##
14
+ # API endpoints.
15
+ #
10
16
  module URL
11
17
  API = 'https://chatapi.viber.com/pa'.freeze
12
18
  WEBHOOK = "#{API}/set_webhook".freeze
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: viberroo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Viktor Habchak
@@ -47,7 +47,7 @@ require_paths:
47
47
  - lib
48
48
  required_ruby_version: !ruby/object:Gem::Requirement
49
49
  requirements:
50
- - - "~>"
50
+ - - ">="
51
51
  - !ruby/object:Gem::Version
52
52
  version: '2.3'
53
53
  required_rubygems_version: !ruby/object:Gem::Requirement
@@ -56,7 +56,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
56
56
  - !ruby/object:Gem::Version
57
57
  version: '0'
58
58
  requirements: []
59
- rubygems_version: 3.0.3
59
+ rubygems_version: 3.3.7
60
60
  signing_key:
61
61
  specification_version: 4
62
62
  summary: Viber bot for Ruby / Rails.