messenger-ruby 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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.