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.
- checksums.yaml +7 -0
- data/README.md +681 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/facebook/messenger/bot/error_parser.rb +111 -0
- data/lib/facebook/messenger/bot/exceptions.rb +15 -0
- data/lib/facebook/messenger/bot/message_type.rb +13 -0
- data/lib/facebook/messenger/bot/messaging_type.rb +12 -0
- data/lib/facebook/messenger/bot/tag.rb +27 -0
- data/lib/facebook/messenger/bot.rb +180 -0
- data/lib/facebook/messenger/configuration/app_secret_proof_calculator.rb +16 -0
- data/lib/facebook/messenger/configuration/providers/base.rb +48 -0
- data/lib/facebook/messenger/configuration/providers/environment.rb +29 -0
- data/lib/facebook/messenger/configuration/providers.rb +13 -0
- data/lib/facebook/messenger/configuration.rb +12 -0
- data/lib/facebook/messenger/error.rb +44 -0
- data/lib/facebook/messenger/incoming/account_linking.rb +28 -0
- data/lib/facebook/messenger/incoming/common.rb +131 -0
- data/lib/facebook/messenger/incoming/delivery.rb +23 -0
- data/lib/facebook/messenger/incoming/feed.rb +16 -0
- data/lib/facebook/messenger/incoming/feed_common.rb +17 -0
- data/lib/facebook/messenger/incoming/game_play.rb +39 -0
- data/lib/facebook/messenger/incoming/leadgen.rb +13 -0
- data/lib/facebook/messenger/incoming/message.rb +159 -0
- data/lib/facebook/messenger/incoming/message_echo.rb +10 -0
- data/lib/facebook/messenger/incoming/message_reaction.rb +23 -0
- data/lib/facebook/messenger/incoming/message_request.rb +13 -0
- data/lib/facebook/messenger/incoming/optin.rb +34 -0
- data/lib/facebook/messenger/incoming/pass_thread_control.rb +22 -0
- data/lib/facebook/messenger/incoming/payment.rb +49 -0
- data/lib/facebook/messenger/incoming/policy_enforcement.rb +21 -0
- data/lib/facebook/messenger/incoming/postback.rb +26 -0
- data/lib/facebook/messenger/incoming/read.rb +21 -0
- data/lib/facebook/messenger/incoming/referral.rb +47 -0
- data/lib/facebook/messenger/incoming.rb +85 -0
- data/lib/facebook/messenger/profile.rb +92 -0
- data/lib/facebook/messenger/server.rb +195 -0
- data/lib/facebook/messenger/server_no_error.rb +36 -0
- data/lib/facebook/messenger/subscriptions.rb +85 -0
- data/lib/facebook/messenger/version.rb +7 -0
- data/lib/facebook/messenger.rb +32 -0
- 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,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: []
|