messenger-ruby 1.0.1 → 1.1.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
  SHA1:
3
- metadata.gz: feead98aa43ea87eb475f71c4033414b3bbb4f69
4
- data.tar.gz: 98f8fa70169398d144e97ea2783f1842a509da0b
3
+ metadata.gz: 1ab3e0f695929b9f936dedcf17c24efce50a45f2
4
+ data.tar.gz: fa08ec9f43a23c204c713dd762bc8f6a7e17bbc5
5
5
  SHA512:
6
- metadata.gz: 047ccb7e6cd3215d2ca5fd33f9fe0f14fb8580f62be9b2292790c1209e1fb421a03df635b2293fd1eaeb78f8660a9f60098dbc98fc6c84bd8da4d66f7ba53504
7
- data.tar.gz: 54001a672501fef069bf8d5e0b889f5656e2ce8600a742daef0f4f64d446a2421a212b19e1af9350f2a6e5629e64c9998d7e4bc2f96045245b9fb5da085c399c
6
+ metadata.gz: ef2449b292db63aa1bd4c8621146aea6a7398d255011e7f99c247d03e1248e4b7cf3da61ea06cc87e6a398cae1718de240bb6552a5079acf74f311f2ac604764
7
+ data.tar.gz: 532de1596b26423ab1e64a24d2a76ae82365bc09d65b939182ff0f97904085d2441bab07c173f84e53dd5a3a746a6d55fe26cec6f97b13479fbfb43036d855db
data/README.md CHANGED
@@ -11,7 +11,7 @@ A simple library for supporting implementation of [Facebook Messenger Bot](https
11
11
  Add this line to your application's Gemfile:
12
12
 
13
13
  ```ruby
14
- gem 'messenger-ruby', git: 'https://github.com/netguru/messenger-ruby.git'
14
+ gem 'messenger-ruby'
15
15
  ```
16
16
 
17
17
  And then execute:
@@ -78,7 +78,7 @@ Run your application and:
78
78
 
79
79
  ## Usage
80
80
 
81
- To send message you need to create [Messenger::Request](#messengerrequest) with one of the available [components](#components) and pass it to [Messenger::Client](#messengerclient)::send method. You can send message only to users who subscribed to your page (e.g. sent some message before).
81
+ To send message you need to create [Messenger::Request](#messengerrequest) with one of the available [components](#components) and pass it to [Messenger::Client](#messengerclient)::send method. You can send message only to users who subscribed to your page (e.g. sent some message before).
82
82
 
83
83
  ### Messenger::Request
84
84
 
@@ -259,11 +259,11 @@ text | String | ✔
259
259
 
260
260
  Here is complete example on how to send sample text to the user:
261
261
  ```ruby
262
- if fb_params.message?
262
+ if fb_params.first_entry.callback.message?
263
263
  Messenger::Client.send(
264
264
  Messenger::Request.new(
265
265
  Messenger::Elements::Text.new(text: 'some text'),
266
- fb_params.sender_id
266
+ fb_params.first_entry.sender_id
267
267
  )
268
268
  )
269
269
  end
@@ -285,7 +285,7 @@ Sending images is simple as well:
285
285
  Messenger::Client.send(
286
286
  Messenger::Request.new(
287
287
  Messenger::Elements::Image.new(url: 'http://lorempixel.com/400/400/cats'),
288
- fb_params.sender_id
288
+ fb_params.first_entry.sender_id
289
289
  )
290
290
  )
291
291
  ...
@@ -324,7 +324,7 @@ generic = Messenger::Templates::Generic.new(
324
324
 
325
325
  #now send Generic template to the user
326
326
  Messenger::Client.send(
327
- Messenger::Request.new(generic, fb_params.sender_id)
327
+ Messenger::Request.new(generic, fb_params.first_entry.sender_id)
328
328
  )
329
329
  ```
330
330
 
@@ -352,7 +352,7 @@ buttons = Messenger::Templates::Buttons.new(
352
352
 
353
353
  #now send Buttons template to the user
354
354
  Messenger::Client.send(
355
- Messenger::Request.new(buttons, fb_params.sender_id)
355
+ Messenger::Request.new(buttons, fb_params.first_entry.sender_id)
356
356
  )
357
357
  ```
358
358
 
@@ -398,24 +398,68 @@ receipt = Messenger::Templates::Receipt.new(
398
398
 
399
399
  #now send Receipt template to the user
400
400
  Messenger::Client.send(
401
- Messenger::Request.new(receipt, fb_params.sender_id)
401
+ Messenger::Request.new(receipt, fb_params.first_entry.sender_id)
402
402
  )
403
403
 
404
404
  ```
405
405
 
406
+ ### Entries
407
+
408
+ According to Facebook documentation, there is possibility that you can receive multiple `entries` and multiple `messagings`.
409
+ That's why we made it easy for you to iterate over `entries` and `messagings`, but we've also created `first_entry` method
410
+ that returns first entry in `entry` array, because that is the most common case.
411
+
412
+ Example usage:
413
+
414
+ ```ruby
415
+ fb_params.entries.each do |entry|
416
+ entry.messagings.each do |messaging|
417
+ if messaging.callback.message?
418
+ Messenger::Client.send(
419
+ Messenger::Request.new(
420
+ Messenger::Elements::Text.new(text: "Echo: #{messaging.callback.text}"),
421
+ messaging.sender_id
422
+ )
423
+ )
424
+ end
425
+ end
426
+ end
427
+ ```
428
+
429
+ Or with `first_entry` method:
430
+
431
+ ```ruby
432
+ if fb_params.first_entry.callback.message?
433
+ Messenger::Client.send(
434
+ Messenger::Request.new(
435
+ Messenger::Elements::Text.new(text: "Echo: #{fb_params.first_entry.callback.text}"),
436
+ fb_params.first_entry.sender_id
437
+ )
438
+ )
439
+ end
440
+ ```
441
+
406
442
  ### fb_params
407
443
 
408
- Deserializes params recived from Facebook. Available in MessengerController. Methods:
444
+ Has control over entries. Especially `callback` attribute of `messaging` instance has following methods:
409
445
 
410
446
  * `message?`
411
447
  * `delivery?`
412
448
  * `postback?`
449
+ * `optin?`
413
450
  * `attachments`
414
- * `text_message`
415
- * `sender_id`
416
- * `recipient_id`
451
+ * `text`
452
+
453
+ Example usage:
417
454
 
418
- _Will be extended soon._
455
+ ```ruby
456
+ fb_params.first_entry.callback.message?
457
+ fb_params.first_entry.callback.postback?
458
+ fb_params.first_entry.callback.delivery?
459
+ fb_params.first_entry.callback.optin?
460
+ fb_params.first_entry.callback.attachments
461
+ fb_params.first_entry.callback.text
462
+ ```
419
463
 
420
464
  ## Development
421
465
 
@@ -1,9 +1,7 @@
1
1
  module Messenger
2
2
  module Components
3
- class Attachment
4
- def initialize
5
- raise 'This class is abstract!'
6
- end
3
+ module Attachment
4
+ attr_accessor :type
7
5
 
8
6
  def build
9
7
  {
@@ -1,10 +1,6 @@
1
1
  module Messenger
2
2
  module Components
3
- class Element
4
- def initialize
5
- raise 'This class is abstract!'
6
- end
7
-
3
+ module Element
8
4
  def build
9
5
  instance_values.delete_if { |_attribute, value| value.nil? }
10
6
  end
@@ -2,13 +2,17 @@ require 'messenger/components/element'
2
2
 
3
3
  module Messenger
4
4
  module Elements
5
- class Bubble < Components::Element
5
+ class Bubble
6
+ include Components::Element
7
+
8
+ attr_accessor :title, :item_url, :image_url, :buttons
9
+
6
10
  def initialize(title:, subtitle: nil, item_url: nil, image_url: nil, buttons: nil)
7
- @title = title
8
- @subtitle = subtitle
11
+ @title = title
12
+ @subtitle = subtitle
9
13
  @image_url = image_url
10
- @item_url = item_url
11
- @buttons = build_buttons(buttons)
14
+ @item_url = item_url
15
+ @buttons = build_buttons(buttons)
12
16
  end
13
17
 
14
18
  def build_buttons(buttons)
@@ -1,8 +1,10 @@
1
1
  module Messenger
2
2
  module Elements
3
3
  class Button
4
+ attr_accessor :type, :title, :value
5
+
4
6
  def initialize(type:, title:, value:)
5
- @type = type
7
+ @type = type
6
8
  @title = title
7
9
  @value = value
8
10
  end
@@ -2,11 +2,15 @@ require 'messenger/components/attachment'
2
2
 
3
3
  module Messenger
4
4
  module Elements
5
- class Image < Components::Attachment
5
+ class Image
6
+ include Components::Attachment
7
+
8
+ attr_accessor :url
9
+
6
10
  ATTRIBUTES = %w(url).freeze
7
11
 
8
12
  def initialize(url:)
9
- @url = url
13
+ @url = url
10
14
  @type = 'image'
11
15
  end
12
16
  end
@@ -2,14 +2,18 @@ require 'messenger/components/element'
2
2
 
3
3
  module Messenger
4
4
  module Elements
5
- class Address < Components::Element
5
+ class Address
6
+ include Components::Element
7
+
8
+ attr_accessor :street_1, :street_2, :city, :postal_code, :state, :country
9
+
6
10
  def initialize(street_1:, street_2: nil, city:, postal_code:, state:, country:)
7
- @street_1 = street_1
8
- @street_2 = street_2
9
- @city = city
11
+ @street_1 = street_1
12
+ @street_2 = street_2
13
+ @city = city
10
14
  @postal_code = postal_code
11
- @state = state
12
- @country = country
15
+ @state = state
16
+ @country = country
13
17
  end
14
18
  end
15
19
  end
@@ -2,9 +2,13 @@ require 'messenger/components/element'
2
2
 
3
3
  module Messenger
4
4
  module Elements
5
- class Adjustment < Components::Element
5
+ class Adjustment
6
+ include Components::Element
7
+
8
+ attr_accessor :name, :amount
9
+
6
10
  def initialize(name: nil, amount: nil)
7
- @name = name
11
+ @name = name
8
12
  @amount = amount
9
13
  end
10
14
  end
@@ -2,13 +2,17 @@ require 'messenger/components/element'
2
2
 
3
3
  module Messenger
4
4
  module Elements
5
- class Item < Components::Element
5
+ class Item
6
+ include Components::Element
7
+
8
+ attr_accessor :title, :subtitle, :quantity, :price, :urrency, :image_url
9
+
6
10
  def initialize(title:, subtitle: nil, quantity: nil, price: nil, currency: nil, image_url: nil)
7
- @title = title
8
- @subtitle = subtitle
9
- @quantity = quantity
10
- @price = price
11
- @currency = currency
11
+ @title = title
12
+ @subtitle = subtitle
13
+ @quantity = quantity
14
+ @price = price
15
+ @currency = currency
12
16
  @image_url = image_url
13
17
  end
14
18
  end
@@ -2,13 +2,17 @@ require 'messenger/components/element'
2
2
 
3
3
  module Messenger
4
4
  module Elements
5
- class Order < Components::Element
5
+ class Order
6
+ include Components::Element
7
+
8
+ attr_accessor :order_number, :currency, :payment_method, :timestamp, :order_url
9
+
6
10
  def initialize(order_number:, currency:, payment_method:, timestamp: nil, order_url: nil)
7
- @order_number = order_number
8
- @currency = currency
11
+ @order_number = order_number
12
+ @currency = currency
9
13
  @payment_method = payment_method
10
- @timestamp = timestamp
11
- @order_url = order_url
14
+ @timestamp = timestamp
15
+ @order_url = order_url
12
16
  end
13
17
  end
14
18
  end
@@ -2,12 +2,16 @@ require 'messenger/components/element'
2
2
 
3
3
  module Messenger
4
4
  module Elements
5
- class Summary < Components::Element
5
+ class Summary
6
+ include Components::Element
7
+
8
+ attr_accessor :subtotal, :shipping_cost, :total_tax, :total_cost
9
+
6
10
  def initialize(subtotal: nil, shipping_cost: nil, total_tax: nil, total_cost:)
7
- @subtotal = subtotal
11
+ @subtotal = subtotal
8
12
  @shipping_cost = shipping_cost
9
- @total_tax = total_tax
10
- @total_cost = total_cost
13
+ @total_tax = total_tax
14
+ @total_cost = total_cost
11
15
  end
12
16
  end
13
17
  end
@@ -1,6 +1,8 @@
1
1
  module Messenger
2
2
  module Elements
3
3
  class Text
4
+ attr_accessor :text
5
+
4
6
  def initialize(text:)
5
7
  @text = text
6
8
  end
@@ -2,14 +2,18 @@ require 'messenger/components/attachment'
2
2
 
3
3
  module Messenger
4
4
  module Templates
5
- class Buttons < Components::Attachment
5
+ class Buttons
6
+ include Components::Attachment
7
+
8
+ attr_accessor :text, :buttons, :template_type
9
+
6
10
  ATTRIBUTES = %w(template_type text buttons).freeze
7
11
 
8
12
  def initialize(text:, buttons:)
9
- @type = 'template'
13
+ @type = 'template'
10
14
  @template_type = 'button'
11
- @text = text
12
- @buttons = build_elements(buttons)
15
+ @text = text
16
+ @buttons = build_elements(buttons)
13
17
  end
14
18
  end
15
19
  end
@@ -2,13 +2,17 @@ require 'messenger/components/attachment'
2
2
 
3
3
  module Messenger
4
4
  module Templates
5
- class Generic < Components::Attachment
5
+ class Generic
6
+ include Components::Attachment
7
+
8
+ attr_accessor :template_type, :elements
9
+
6
10
  ATTRIBUTES = %w(template_type elements).freeze
7
11
 
8
12
  def initialize(elements:)
9
- @type = 'template'
13
+ @type = 'template'
10
14
  @template_type = 'generic'
11
- @elements = build_elements(elements)
15
+ @elements = build_elements(elements)
12
16
  end
13
17
  end
14
18
  end
@@ -2,7 +2,11 @@ require 'messenger/components/attachment'
2
2
 
3
3
  module Messenger
4
4
  module Templates
5
- class Receipt < Components::Attachment
5
+ class Receipt
6
+ include Components::Attachment
7
+
8
+ attr_accessor :template_type, :recipient_name, :order, :elements, :address, :summary, :adjustments
9
+
6
10
  ATTRIBUTES = %w(
7
11
  template_type
8
12
  recipient_name
@@ -18,14 +22,14 @@ module Messenger
18
22
  ).freeze
19
23
 
20
24
  def initialize(recipient_name:, order:, elements:, address: nil, summary:, adjustments: nil)
21
- @type = 'template'
22
- @template_type = 'receipt'
25
+ @type = 'template'
26
+ @template_type = 'receipt'
23
27
  @recipient_name = recipient_name
24
- @order = order
25
- @elements = build_elements(elements)
26
- @address = address.build
27
- @summary = summary.build
28
- @adjustments = build_elements(adjustments)
28
+ @order = order
29
+ @elements = build_elements(elements)
30
+ @address = address.build
31
+ @summary = summary.build
32
+ @adjustments = build_elements(adjustments)
29
33
  end
30
34
 
31
35
  def flattened_attributes
@@ -0,0 +1,12 @@
1
+ module Messenger
2
+ module Parameters
3
+ class Attachment
4
+ attr_accessor :type, :url
5
+
6
+ def initialize(type:, payload:)
7
+ @type = type
8
+ @url = payload['url']
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ module Messenger
2
+ module Parameters
3
+ module Callback
4
+ %w(message delivery optin postback).each do |method|
5
+ define_method("#{method}?") do
6
+ type.include?(method)
7
+ end
8
+ end
9
+
10
+ def type
11
+ self.class.to_s.downcase
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module Messenger
2
+ module Parameters
3
+ class Delivery
4
+ include Callback
5
+
6
+ attr_accessor :mids, :watermark, :seq
7
+
8
+ def initialize(mids: nil, watermark:, seq:)
9
+ @mids = mids
10
+ @watermark = watermark
11
+ @seq = seq
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ module Messenger
2
+ module Parameters
3
+ class Entry
4
+ attr_accessor :id, :time, :messagings
5
+
6
+ def initialize(id:, time:, messaging: nil)
7
+ @id = id
8
+ @time = time
9
+ @messagings = build_messagings(messaging) if messaging.present?
10
+ end
11
+
12
+ def build_messagings(messagings)
13
+ messagings.map { |messaging| Messaging.new(messaging.symbolize_keys) }
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ module Messenger
2
+ module Parameters
3
+ class Message
4
+ include Callback
5
+
6
+ attr_accessor :mid, :seq, :text, :attachments
7
+
8
+ def initialize(mid:, seq:, text: nil, attachments: nil)
9
+ @mid = mid
10
+ @seq = seq
11
+ @text = text if text.present?
12
+ @attachments = build_attachments(attachments) if attachments.present?
13
+ end
14
+
15
+ def build_attachments(attachments)
16
+ attachments.map { |attachment| Attachment.new(attachment.symbolize_keys) }
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ module Messenger
2
+ module Parameters
3
+ class Messaging
4
+ attr_accessor :sender_id, :recipient_id, :callback
5
+
6
+ def initialize(sender:, recipient:, timestamp: nil, message: nil, delivery: nil, postback: nil, optin: nil)
7
+ @sender_id = sender['id']
8
+ @recipient_id = recipient['id']
9
+ @callback = set_callback(message: message, delivery: delivery, postback: postback, optin: optin)
10
+ end
11
+
12
+ def set_callback(callbacks)
13
+ type = callbacks.select { |_, v| v.present? }.keys.first
14
+ @callback = constant(type).new(callbacks[type].symbolize_keys)
15
+ end
16
+
17
+ private
18
+
19
+ def constant(symbol)
20
+ "Messenger::Parameters::#{symbol.to_s.camelize}".constantize
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ module Messenger
2
+ module Parameters
3
+ class Optin
4
+ include Callback
5
+
6
+ attr_accessor :ref
7
+
8
+ def initialize(ref:)
9
+ @ref = ref
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Messenger
2
+ module Parameters
3
+ class Postback
4
+ include Callback
5
+
6
+ attr_accessor :payload
7
+
8
+ def initialize(payload:)
9
+ @payload = payload
10
+ end
11
+ end
12
+ end
13
+ end
@@ -6,38 +6,26 @@ module Messenger
6
6
  @params = params
7
7
  end
8
8
 
9
- def message?
10
- messaging_entry.key?('message')
9
+ def entries
10
+ @entries_objects ||= build_entries
11
11
  end
12
12
 
13
- def delivery?
14
- messaging_entry.key?('delivery')
15
- end
16
-
17
- def postback?
18
- messaging_entry.key?('postback')
19
- end
20
-
21
- def attachments
22
- messaging_entry['message']['attachments'].map { |a| a['payload']['url'] }
23
- end
24
-
25
- def text_message
26
- messaging_entry['message']['text']
27
- end
28
-
29
- def sender_id
30
- messaging_entry['sender']['id']
31
- end
32
-
33
- def recipient_id
34
- messaging_entry['recipient']['id']
13
+ def first_entry
14
+ entries[0].messagings[0]
35
15
  end
36
16
 
37
17
  private
38
18
 
39
- def messaging_entry
40
- params['entry'][0]['messaging'][0]
19
+ def build_entries
20
+ entries_objects = []
21
+ params['entry'].each do |entry|
22
+ entries_objects << Messenger::Parameters::Entry.new({
23
+ "id"=>entry["id"],
24
+ "time"=>entry["time"],
25
+ "messaging"=>entry["messaging"]
26
+ }.symbolize_keys)
27
+ end
28
+ entries_objects
41
29
  end
42
30
  end
43
31
  end
@@ -1,3 +1,3 @@
1
1
  module Messenger
2
- VERSION = "1.0.1"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -1,24 +1,6 @@
1
1
  require "messenger/version"
2
2
  require "messenger/configuration"
3
3
 
4
- require "messenger/components/elements/text"
5
- require "messenger/components/elements/image"
6
- require "messenger/components/elements/button"
7
- require "messenger/components/elements/bubble"
8
-
9
- require "messenger/components/elements/receipt/address"
10
- require "messenger/components/elements/receipt/adjustment"
11
- require "messenger/components/elements/receipt/item"
12
- require "messenger/components/elements/receipt/order"
13
- require "messenger/components/elements/receipt/summary"
14
-
15
- require "messenger/components/templates/buttons"
16
- require "messenger/components/templates/generic"
17
- require "messenger/components/templates/receipt"
18
-
19
- require "messenger/client"
20
- require "messenger/request"
21
-
22
4
  module Messenger
23
5
  class << self
24
6
  attr_accessor :config
@@ -39,3 +21,31 @@ end
39
21
 
40
22
  require "messenger/engine"
41
23
  require "messenger/params"
24
+
25
+ require "messenger/components/elements/text"
26
+ require "messenger/components/elements/image"
27
+ require "messenger/components/elements/button"
28
+ require "messenger/components/elements/bubble"
29
+
30
+ require "messenger/parameters/attachment"
31
+ require "messenger/parameters/callback"
32
+ require "messenger/parameters/entry"
33
+ require "messenger/parameters/messaging"
34
+
35
+ require "messenger/parameters/delivery"
36
+ require "messenger/parameters/message"
37
+ require "messenger/parameters/optin"
38
+ require "messenger/parameters/postback"
39
+
40
+ require "messenger/components/elements/receipt/address"
41
+ require "messenger/components/elements/receipt/adjustment"
42
+ require "messenger/components/elements/receipt/item"
43
+ require "messenger/components/elements/receipt/order"
44
+ require "messenger/components/elements/receipt/summary"
45
+
46
+ require "messenger/components/templates/buttons"
47
+ require "messenger/components/templates/generic"
48
+ require "messenger/components/templates/receipt"
49
+
50
+ require "messenger/client"
51
+ require "messenger/request"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: messenger-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - justynjozwiak
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2016-04-22 00:00:00.000000000 Z
12
+ date: 2016-04-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
@@ -174,6 +174,14 @@ files:
174
174
  - lib/messenger/components/templates/receipt.rb
175
175
  - lib/messenger/configuration.rb
176
176
  - lib/messenger/engine.rb
177
+ - lib/messenger/parameters/attachment.rb
178
+ - lib/messenger/parameters/callback.rb
179
+ - lib/messenger/parameters/delivery.rb
180
+ - lib/messenger/parameters/entry.rb
181
+ - lib/messenger/parameters/message.rb
182
+ - lib/messenger/parameters/messaging.rb
183
+ - lib/messenger/parameters/optin.rb
184
+ - lib/messenger/parameters/postback.rb
177
185
  - lib/messenger/params.rb
178
186
  - lib/messenger/request.rb
179
187
  - lib/messenger/version.rb
@@ -198,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
198
206
  version: '0'
199
207
  requirements: []
200
208
  rubyforge_project:
201
- rubygems_version: 2.5.1
209
+ rubygems_version: 2.4.8
202
210
  signing_key:
203
211
  specification_version: 4
204
212
  summary: A library for supporting implementation of Facebook Messenger Bots.