meta-messenger 2.1.2

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.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +681 -0
  3. data/bin/console +14 -0
  4. data/bin/setup +8 -0
  5. data/lib/facebook/messenger/bot/error_parser.rb +111 -0
  6. data/lib/facebook/messenger/bot/exceptions.rb +15 -0
  7. data/lib/facebook/messenger/bot/message_type.rb +13 -0
  8. data/lib/facebook/messenger/bot/messaging_type.rb +12 -0
  9. data/lib/facebook/messenger/bot/tag.rb +27 -0
  10. data/lib/facebook/messenger/bot.rb +180 -0
  11. data/lib/facebook/messenger/configuration/app_secret_proof_calculator.rb +16 -0
  12. data/lib/facebook/messenger/configuration/providers/base.rb +48 -0
  13. data/lib/facebook/messenger/configuration/providers/environment.rb +29 -0
  14. data/lib/facebook/messenger/configuration/providers.rb +13 -0
  15. data/lib/facebook/messenger/configuration.rb +12 -0
  16. data/lib/facebook/messenger/error.rb +44 -0
  17. data/lib/facebook/messenger/incoming/account_linking.rb +28 -0
  18. data/lib/facebook/messenger/incoming/common.rb +131 -0
  19. data/lib/facebook/messenger/incoming/delivery.rb +23 -0
  20. data/lib/facebook/messenger/incoming/feed.rb +16 -0
  21. data/lib/facebook/messenger/incoming/feed_common.rb +17 -0
  22. data/lib/facebook/messenger/incoming/game_play.rb +39 -0
  23. data/lib/facebook/messenger/incoming/leadgen.rb +13 -0
  24. data/lib/facebook/messenger/incoming/message.rb +159 -0
  25. data/lib/facebook/messenger/incoming/message_echo.rb +10 -0
  26. data/lib/facebook/messenger/incoming/message_reaction.rb +23 -0
  27. data/lib/facebook/messenger/incoming/message_request.rb +13 -0
  28. data/lib/facebook/messenger/incoming/optin.rb +34 -0
  29. data/lib/facebook/messenger/incoming/pass_thread_control.rb +22 -0
  30. data/lib/facebook/messenger/incoming/payment.rb +49 -0
  31. data/lib/facebook/messenger/incoming/policy_enforcement.rb +21 -0
  32. data/lib/facebook/messenger/incoming/postback.rb +26 -0
  33. data/lib/facebook/messenger/incoming/read.rb +21 -0
  34. data/lib/facebook/messenger/incoming/referral.rb +47 -0
  35. data/lib/facebook/messenger/incoming.rb +85 -0
  36. data/lib/facebook/messenger/profile.rb +92 -0
  37. data/lib/facebook/messenger/server.rb +195 -0
  38. data/lib/facebook/messenger/server_no_error.rb +36 -0
  39. data/lib/facebook/messenger/subscriptions.rb +85 -0
  40. data/lib/facebook/messenger/version.rb +7 -0
  41. data/lib/facebook/messenger.rb +32 -0
  42. metadata +229 -0
@@ -0,0 +1,92 @@
1
+ require 'httparty'
2
+
3
+ module Facebook
4
+ module Messenger
5
+ #
6
+ # This module provide functionality to manage the messenger profile.
7
+ # @see https://developers.facebook.com/docs/messenger-platform/messenger-profile
8
+ #
9
+ module Profile
10
+ include HTTParty
11
+
12
+ # Define base_uri for HTTParty.
13
+ base_uri 'https://graph.facebook.com/v20.0/me'
14
+
15
+ format :json
16
+
17
+ module_function
18
+
19
+ #
20
+ # Set the messenger profile.
21
+ #
22
+ # @raise [Facebook::Messenger::Profile::Error] if there is any error
23
+ # in response.
24
+ #
25
+ # @param [Hash] settings Hash defining the profile settings.
26
+ # @param [String] access_token Access token of facebook page.
27
+ #
28
+ # @return [Boolean] If profile is successfully set, return true.
29
+ #
30
+ def set(settings, access_token:)
31
+ response = post '/messenger_profile', body: settings.to_json, query: {
32
+ access_token: access_token
33
+ }
34
+
35
+ raise_errors(response)
36
+
37
+ true
38
+ end
39
+
40
+ #
41
+ # Unset the messenger profile.
42
+ #
43
+ # @raise [Facebook::Messenger::Profile::Error] if there is any error
44
+ # in response.
45
+ #
46
+ # @param [Hash] settings Hash defining the profile settings.
47
+ # @param [String] access_token Access token of facebook page.
48
+ #
49
+ # @return [Boolean] If profile is successfully removed, return true.
50
+ #
51
+ def unset(settings, access_token:)
52
+ response = delete '/messenger_profile', body: settings.to_json, query: {
53
+ access_token: access_token
54
+ }
55
+
56
+ raise_errors(response)
57
+
58
+ true
59
+ end
60
+
61
+ #
62
+ # Function raise error if response has error key.
63
+ #
64
+ # @raise [Facebook::Messenger::Profile::Error] if error is present
65
+ # in response.
66
+ #
67
+ # @param [Hash] response Response hash from facebook.
68
+ #
69
+ def raise_errors(response)
70
+ raise Error, response['error'] if response.key? 'error'
71
+ end
72
+
73
+ #
74
+ # Default HTTParty options.
75
+ #
76
+ # @return [Hash] Default HTTParty options.
77
+ #
78
+ def default_options
79
+ super.merge(
80
+ headers: {
81
+ 'Content-Type' => 'application/json'
82
+ }
83
+ )
84
+ end
85
+
86
+ #
87
+ # Class Error provides errors related to profile subscriptions.
88
+ #
89
+ class Error < Facebook::Messenger::FacebookError; end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,195 @@
1
+ require 'rack'
2
+ require 'json'
3
+ require 'openssl'
4
+
5
+ module Facebook
6
+ module Messenger
7
+ class BadRequestError < Error; end
8
+
9
+ X_HUB_SIGNATURE_MISSING_WARNING = <<-HEREDOC.freeze
10
+ The X-Hub-Signature header is not present in the request. This is
11
+ expected for the first webhook requests. If it continues after
12
+ some time, check your app's secret token.
13
+ HEREDOC
14
+
15
+ #
16
+ # This module holds the server that processes incoming messages from the
17
+ # Facebook Messenger Platform.
18
+ #
19
+ class Server
20
+ def self.call(env)
21
+ new.call(env)
22
+ end
23
+
24
+ # Rack handler for request.
25
+ def call(env)
26
+ @request = Rack::Request.new(env)
27
+ @response = Rack::Response.new
28
+
29
+ if @request.get?
30
+ verify
31
+ elsif @request.post?
32
+ receive
33
+ else
34
+ @response.status = 405
35
+ end
36
+
37
+ @response.finish
38
+ end
39
+
40
+ # @private
41
+ private
42
+
43
+ #
44
+ # Function validates the verification request which is sent by Facebook
45
+ # to validate the entered endpoint.
46
+ # @see https://developers.facebook.com/docs/graph-api/webhooks#callback
47
+ #
48
+ def verify
49
+ if valid_verify_token?(@request.params['hub.verify_token'])
50
+ @response.write @request.params['hub.challenge']
51
+ else
52
+ @response.write 'Error; wrong verify token'
53
+ end
54
+ end
55
+
56
+ #
57
+ # Function handles the webhook events.
58
+ # @raise BadRequestError if the request is tampered.
59
+ #
60
+ def receive
61
+ check_integrity
62
+
63
+ trigger(parsed_body)
64
+ rescue BadRequestError => error
65
+ respond_with_error(error)
66
+ end
67
+
68
+ #
69
+ # Check the integrity of the request.
70
+ # @see https://developers.facebook.com/docs/messenger-platform/webhook#security
71
+ #
72
+ # @raise BadRequestError if the request has been tampered with.
73
+ #
74
+ def check_integrity
75
+ # If app secret is not found in environment, return.
76
+ # So for the security purpose always add provision in
77
+ # configuration provider to return app secret.
78
+ return unless app_secret_for(parsed_body['entry'][0]['id'])
79
+
80
+ unless signature.start_with?('sha1='.freeze)
81
+ warn X_HUB_SIGNATURE_MISSING_WARNING
82
+
83
+ raise BadRequestError, 'Error getting integrity signature'.freeze
84
+ end
85
+
86
+ raise BadRequestError, 'Error checking message integrity'.freeze \
87
+ unless valid_signature?
88
+ end
89
+
90
+ # Returns a String describing the X-Hub-Signature header.
91
+ def signature
92
+ @request.env['HTTP_X_HUB_SIGNATURE'.freeze].to_s
93
+ end
94
+
95
+ #
96
+ # Verify that the signature given in the X-Hub-Signature header matches
97
+ # that of the body.
98
+ #
99
+ # @return [Boolean] true if request is valid else false.
100
+ #
101
+ def valid_signature?
102
+ Rack::Utils.secure_compare(signature, signature_for(body))
103
+ end
104
+
105
+ #
106
+ # Sign the given string.
107
+ #
108
+ # @return [String] A string describing its signature.
109
+ #
110
+ def signature_for(string)
111
+ format('sha1=%<string>s'.freeze, string: generate_hmac(string))
112
+ end
113
+
114
+ # Generate a HMAC signature for the given content.
115
+ def generate_hmac(content)
116
+ content_json = JSON.parse(content, symbolize_names: true)
117
+ facebook_page_id = content_json[:entry][0][:id]
118
+
119
+ OpenSSL::HMAC.hexdigest('sha1'.freeze,
120
+ app_secret_for(facebook_page_id),
121
+ content)
122
+ end
123
+
124
+ # Returns a String describing the bot's configured app secret.
125
+ def app_secret_for(facebook_page_id)
126
+ Facebook::Messenger.config.provider.app_secret_for(facebook_page_id)
127
+ end
128
+
129
+ # Checks whether a verify token is valid.
130
+ def valid_verify_token?(token)
131
+ Facebook::Messenger.config.provider.valid_verify_token?(token)
132
+ end
133
+
134
+ # Returns a String describing the request body.
135
+ def body
136
+ @body ||= @request.body.read
137
+ end
138
+
139
+ #
140
+ # Returns a Hash describing the parsed request body.
141
+ # @raise JSON::ParserError if body hash is not valid.
142
+ #
143
+ # @return [JSON] Parsed body hash.
144
+ #
145
+ def parsed_body
146
+ @parsed_body ||= JSON.parse(body)
147
+ rescue JSON::ParserError => error
148
+ raise BadRequestError, error
149
+ end
150
+
151
+ #
152
+ # Function hand over the webhook event to handlers.
153
+ #
154
+ # @param [Hash] events Parsed body hash in webhook event.
155
+ #
156
+ def trigger(events)
157
+ # Facebook may batch several items in the 'entry' array during
158
+ # periods of high load.
159
+ events['entry'.freeze].each do |entry|
160
+
161
+ # Facebook may batch several items in the 'messaging' array during
162
+ # periods of high load.
163
+ if entry['messaging'.freeze]
164
+ entry['messaging'.freeze].each do |messaging|
165
+ Facebook::Messenger::Bot.receive(messaging)
166
+ end
167
+ end
168
+ if entry['changes'.freeze]
169
+ entry['changes'.freeze].each do |change|
170
+ Facebook::Messenger::Bot.receive(change)
171
+ end
172
+ end
173
+ # d99d
174
+ if entry['standby'.freeze]
175
+ entry['standby'.freeze].each do |messaging|
176
+ Facebook::Messenger::Bot.receive(messaging)
177
+ end
178
+ end
179
+ # .
180
+ end
181
+ end
182
+
183
+ #
184
+ # If received request is tampered, sent 400 code in response.
185
+ #
186
+ # @param [Object] error Error object.
187
+ #
188
+ def respond_with_error(error)
189
+ @response.status = 400
190
+ @response.write(error.message)
191
+ @response.headers['Content-Type'.freeze] = 'text/plain'.freeze
192
+ end
193
+ end
194
+ end
195
+ end
@@ -0,0 +1,36 @@
1
+ require_relative 'server'
2
+
3
+ module Facebook
4
+ module Messenger
5
+ # Server rescuing all errors sending the backtrace back to the chat
6
+ # FOR DEVELOPPING PURPOSE
7
+ class ServerNoError < Server
8
+ SCREAMING_FACE = "\xF0\x9F\x98\xB1".freeze
9
+ MAX_MESSAGE_LENGTH = 639
10
+
11
+ def call(env)
12
+ super
13
+ rescue Exception => e # rubocop:disable Lint/RescueException
14
+ send(SCREAMING_FACE)
15
+ send(e.inspect)
16
+ send(e.backtrace.join("\n")[0..MAX_MESSAGE_LENGTH - 3] + '...')
17
+
18
+ @response.status = 200
19
+ @response.finish
20
+ end
21
+
22
+ private
23
+
24
+ def sender
25
+ parsed_body['entry'][0]['messaging'][0]['sender']
26
+ end
27
+
28
+ def send(text)
29
+ Bot.deliver({
30
+ recipient: sender,
31
+ message: { text: text }
32
+ }, access_token: ENV['ACCESS_TOKEN'])
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,85 @@
1
+ require 'httparty'
2
+
3
+ module Facebook
4
+ module Messenger
5
+ #
6
+ # Module Subscriptions handles subscribing and unsubscribing Applications
7
+ # to Pages.
8
+ #
9
+ module Subscriptions
10
+ include HTTParty
11
+
12
+ base_uri 'https://graph.facebook.com/v20.0/me'
13
+
14
+ format :json
15
+
16
+ module_function
17
+
18
+ #
19
+ # Function subscribe the facebook app to page.
20
+ # @see https://developers.facebook.com/docs/graph-api/reference/page/subscribed_apps
21
+ #
22
+ # @raise [Facebook::Messenger::Subscriptions::Error] if there is any error
23
+ # in the response of subscribed_apps request.
24
+ #
25
+ # @param [String] access_token Access token of page to which bot has
26
+ # to subscribe.
27
+ #
28
+ # @return [Boolean] TRUE
29
+ #
30
+ def subscribe(access_token:, subscribed_fields: [])
31
+ response = post '/subscribed_apps',
32
+ headers: { 'Content-Type' => 'application/json' },
33
+ body: {
34
+ access_token: access_token,
35
+ subscribed_fields: subscribed_fields
36
+ }.to_json
37
+
38
+ raise_errors(response)
39
+
40
+ true
41
+ end
42
+
43
+ #
44
+ # Function unsubscribe the app from facebook page.
45
+ # @see https://developers.facebook.com/docs/graph-api/reference/page/subscribed_apps
46
+ #
47
+ # @raise [Facebook::Messenger::Subscriptions::Error] if there is any error
48
+ # in the response of subscribed_apps request.
49
+ #
50
+ # @param [String] access_token Access token of page from which app has
51
+ # to unsubscribe.
52
+ #
53
+ # @return [Boolean] TRUE
54
+ #
55
+ def unsubscribe(access_token:)
56
+ response = delete '/subscribed_apps', query: {
57
+ access_token: access_token
58
+ }
59
+
60
+ raise_errors(response)
61
+
62
+ true
63
+ end
64
+
65
+ #
66
+ # If there is any error in response, raise error.
67
+ #
68
+ # @raise [Facebook::Messenger::Subscriptions::Error] If there is error
69
+ # in response.
70
+ #
71
+ # @param [Hash] response Response from facebook.
72
+ #
73
+ # @return Raise the error.
74
+ #
75
+ def raise_errors(response)
76
+ raise Error, response['error'] if response.key? 'error'
77
+ end
78
+
79
+ #
80
+ # Class Error provides errors related to subscriptions.
81
+ #
82
+ class Error < Facebook::Messenger::FacebookError; end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,7 @@
1
+ module Facebook
2
+ module Messenger
3
+ #
4
+ # @return [String] Define the version of gem.
5
+ VERSION = '2.1.2'.freeze
6
+ end
7
+ end
@@ -0,0 +1,32 @@
1
+ require 'facebook/messenger/version'
2
+ require 'facebook/messenger/error'
3
+ require 'facebook/messenger/subscriptions'
4
+ require 'facebook/messenger/profile'
5
+ require 'facebook/messenger/bot'
6
+ require 'facebook/messenger/server'
7
+ require 'facebook/messenger/server_no_error'
8
+ require 'facebook/messenger/configuration'
9
+ require 'facebook/messenger/incoming'
10
+
11
+ module Facebook
12
+ # All the code for this gem resides in this module.
13
+ module Messenger
14
+ def self.configure
15
+ yield config
16
+ end
17
+
18
+ def self.config
19
+ @config ||= Configuration.new
20
+ end
21
+
22
+ def self.config=(config)
23
+ @config = config
24
+ end
25
+
26
+ # Set the default configuration provider.
27
+ # Developer can set different configuration provider.
28
+ configure do |config|
29
+ config.provider = Configuration::Providers::Environment.new
30
+ end
31
+ end
32
+ end
metadata ADDED
@@ -0,0 +1,229 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: meta-messenger
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Johannes Gorset
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2025-06-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.13'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.13.7
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '0.13'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 0.13.7
33
+ - !ruby/object:Gem::Dependency
34
+ name: rack
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 1.4.5
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.4.5
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.1'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '2.1'
61
+ - !ruby/object:Gem::Dependency
62
+ name: coveralls
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: pry
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rack-test
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: 0.6.3
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: 0.6.3
103
+ - !ruby/object:Gem::Dependency
104
+ name: rake
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: 13.0.1
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: 13.0.1
117
+ - !ruby/object:Gem::Dependency
118
+ name: rspec
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '3.9'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '3.9'
131
+ - !ruby/object:Gem::Dependency
132
+ name: rubocop
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: 0.58.1
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: 0.58.1
145
+ - !ruby/object:Gem::Dependency
146
+ name: webmock
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: 3.8.1
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: 3.8.1
159
+ description: Facebook Messenger client
160
+ email:
161
+ - jgorset@gmail.com
162
+ executables: []
163
+ extensions: []
164
+ extra_rdoc_files: []
165
+ files:
166
+ - README.md
167
+ - bin/console
168
+ - bin/setup
169
+ - lib/facebook/messenger.rb
170
+ - lib/facebook/messenger/bot.rb
171
+ - lib/facebook/messenger/bot/error_parser.rb
172
+ - lib/facebook/messenger/bot/exceptions.rb
173
+ - lib/facebook/messenger/bot/message_type.rb
174
+ - lib/facebook/messenger/bot/messaging_type.rb
175
+ - lib/facebook/messenger/bot/tag.rb
176
+ - lib/facebook/messenger/configuration.rb
177
+ - lib/facebook/messenger/configuration/app_secret_proof_calculator.rb
178
+ - lib/facebook/messenger/configuration/providers.rb
179
+ - lib/facebook/messenger/configuration/providers/base.rb
180
+ - lib/facebook/messenger/configuration/providers/environment.rb
181
+ - lib/facebook/messenger/error.rb
182
+ - lib/facebook/messenger/incoming.rb
183
+ - lib/facebook/messenger/incoming/account_linking.rb
184
+ - lib/facebook/messenger/incoming/common.rb
185
+ - lib/facebook/messenger/incoming/delivery.rb
186
+ - lib/facebook/messenger/incoming/feed.rb
187
+ - lib/facebook/messenger/incoming/feed_common.rb
188
+ - lib/facebook/messenger/incoming/game_play.rb
189
+ - lib/facebook/messenger/incoming/leadgen.rb
190
+ - lib/facebook/messenger/incoming/message.rb
191
+ - lib/facebook/messenger/incoming/message_echo.rb
192
+ - lib/facebook/messenger/incoming/message_reaction.rb
193
+ - lib/facebook/messenger/incoming/message_request.rb
194
+ - lib/facebook/messenger/incoming/optin.rb
195
+ - lib/facebook/messenger/incoming/pass_thread_control.rb
196
+ - lib/facebook/messenger/incoming/payment.rb
197
+ - lib/facebook/messenger/incoming/policy_enforcement.rb
198
+ - lib/facebook/messenger/incoming/postback.rb
199
+ - lib/facebook/messenger/incoming/read.rb
200
+ - lib/facebook/messenger/incoming/referral.rb
201
+ - lib/facebook/messenger/profile.rb
202
+ - lib/facebook/messenger/server.rb
203
+ - lib/facebook/messenger/server_no_error.rb
204
+ - lib/facebook/messenger/subscriptions.rb
205
+ - lib/facebook/messenger/version.rb
206
+ homepage: https://github.com/hyperoslo/facebook-messenger
207
+ licenses:
208
+ - MIT
209
+ metadata: {}
210
+ post_install_message:
211
+ rdoc_options: []
212
+ require_paths:
213
+ - lib
214
+ required_ruby_version: !ruby/object:Gem::Requirement
215
+ requirements:
216
+ - - ">="
217
+ - !ruby/object:Gem::Version
218
+ version: '0'
219
+ required_rubygems_version: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - ">="
222
+ - !ruby/object:Gem::Version
223
+ version: '0'
224
+ requirements: []
225
+ rubygems_version: 3.2.3
226
+ signing_key:
227
+ specification_version: 4
228
+ summary: Facebook Messenger client
229
+ test_files: []