messagebird-rest 1.4.1 → 1.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/messagebird.rb +2 -2
- data/lib/messagebird/client.rb +89 -4
- data/lib/messagebird/contact.rb +3 -3
- data/lib/messagebird/conversation.rb +42 -0
- data/lib/messagebird/conversation_channel.rb +17 -0
- data/lib/messagebird/conversation_client.rb +19 -0
- data/lib/messagebird/conversation_message.rb +9 -0
- data/lib/messagebird/conversation_webhook.rb +7 -0
- data/lib/messagebird/group.rb +3 -3
- data/lib/messagebird/hlr.rb +2 -2
- data/lib/messagebird/http_client.rb +24 -9
- data/lib/messagebird/list.rb +1 -2
- data/lib/messagebird/message.rb +3 -3
- data/lib/messagebird/recipient.rb +2 -1
- data/lib/messagebird/signed_request.rb +47 -0
- data/lib/messagebird/verify.rb +2 -2
- data/lib/messagebird/voicemessage.rb +2 -3
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8af99a7a5eb2bb8576cfe1e880ed6443a13a962
|
4
|
+
data.tar.gz: c86b5b379a2e012af6494de574619ac0b0af5cc6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a223e47afb796eb24c1cba0ff1cb8d50d3a695f1586f2805703050692631076fd98392a024b30c701ff246c8184a5ad2f19a6c747cffcd3f2d6a1d9ac74fd85d
|
7
|
+
data.tar.gz: 879e546638600315f1dcb2bf3dbc45cd82f08d4f8ae7fa7949be49d26a50abe956571c711bb696adfc5a0a15ff8ae708350e5c5b5e85a25964aed9242aa8da24
|
data/lib/messagebird.rb
CHANGED
@@ -2,8 +2,7 @@ libdir = File.dirname(__FILE__)
|
|
2
2
|
$:.unshift(libdir) unless $:.include?(libdir)
|
3
3
|
|
4
4
|
module MessageBird
|
5
|
-
CLIENT_VERSION
|
6
|
-
ENDPOINT = 'https://rest.messagebird.com'
|
5
|
+
CLIENT_VERSION = '1.4.2'
|
7
6
|
end
|
8
7
|
|
9
8
|
require 'messagebird/balance'
|
@@ -14,6 +13,7 @@ require 'messagebird/group_reference'
|
|
14
13
|
require 'messagebird/hlr'
|
15
14
|
require 'messagebird/http_client'
|
16
15
|
require 'messagebird/message_reference'
|
16
|
+
require 'messagebird/signed_request'
|
17
17
|
require 'messagebird/verify'
|
18
18
|
require 'messagebird/message'
|
19
19
|
require 'messagebird/voicemessage'
|
data/lib/messagebird/client.rb
CHANGED
@@ -4,6 +4,10 @@ require 'uri'
|
|
4
4
|
|
5
5
|
require 'messagebird/balance'
|
6
6
|
require 'messagebird/contact'
|
7
|
+
require 'messagebird/conversation'
|
8
|
+
require 'messagebird/conversation_client'
|
9
|
+
require 'messagebird/conversation_message'
|
10
|
+
require 'messagebird/conversation_webhook'
|
7
11
|
require 'messagebird/error'
|
8
12
|
require 'messagebird/group'
|
9
13
|
require 'messagebird/hlr'
|
@@ -24,20 +28,28 @@ module MessageBird
|
|
24
28
|
end
|
25
29
|
|
26
30
|
class Client
|
27
|
-
|
28
|
-
attr_reader :access_key
|
29
|
-
attr_reader :http_client
|
31
|
+
attr_reader :access_key, :http_client, :conversation_client
|
30
32
|
|
31
33
|
def initialize(access_key = nil, http_client = nil)
|
32
34
|
@access_key = access_key || ENV['MESSAGEBIRD_ACCESS_KEY']
|
33
35
|
@http_client = http_client || HttpClient.new(@access_key)
|
36
|
+
@conversation_client = http_client || ConversationClient.new(@access_key)
|
37
|
+
end
|
38
|
+
|
39
|
+
def conversation_request(method, path, params={})
|
40
|
+
response_body = @conversation_client.request(method, path, params)
|
41
|
+
return if response_body.nil? || response_body.empty?
|
42
|
+
parse_body(response_body)
|
34
43
|
end
|
35
44
|
|
36
45
|
def request(method, path, params={})
|
37
46
|
response_body = @http_client.request(method, path, params)
|
38
47
|
return if response_body.empty?
|
48
|
+
parse_body(response_body)
|
49
|
+
end
|
39
50
|
|
40
|
-
|
51
|
+
def parse_body(body)
|
52
|
+
json = JSON.parse(body)
|
41
53
|
|
42
54
|
# If the request returned errors, create Error objects and raise.
|
43
55
|
if json.has_key?('errors')
|
@@ -47,6 +59,79 @@ module MessageBird
|
|
47
59
|
json
|
48
60
|
end
|
49
61
|
|
62
|
+
## Conversations
|
63
|
+
# Send a conversation message
|
64
|
+
def send_conversation_message(from, to, params={})
|
65
|
+
ConversationMessage.new(conversation_request(
|
66
|
+
:post,
|
67
|
+
'send',
|
68
|
+
params.merge({
|
69
|
+
:from => from,
|
70
|
+
:to => to,
|
71
|
+
})))
|
72
|
+
end
|
73
|
+
|
74
|
+
# Start a conversation
|
75
|
+
def start_conversation(to, channelId, params={})
|
76
|
+
Conversation.new(conversation_request(
|
77
|
+
:post,
|
78
|
+
'conversations/start',
|
79
|
+
params.merge({
|
80
|
+
:to => to,
|
81
|
+
:channelId => channelId,
|
82
|
+
})))
|
83
|
+
end
|
84
|
+
|
85
|
+
def conversation_list(limit = 0, offset = 0)
|
86
|
+
List.new(Conversation, conversation_request(:get, "conversations?limit=#{limit}&offset=#{offset}"))
|
87
|
+
end
|
88
|
+
|
89
|
+
def conversation(id)
|
90
|
+
Conversation.new(conversation_request(:get, "conversations/#{id}"))
|
91
|
+
end
|
92
|
+
|
93
|
+
def conversation_update(id, status)
|
94
|
+
Conversation.new(conversation_request(:patch, "conversations/#{id}", :status => status))
|
95
|
+
end
|
96
|
+
|
97
|
+
def conversation_reply(id, params={})
|
98
|
+
ConversationMessage.new(conversation_request(:post, "conversations/#{id}/messages", params))
|
99
|
+
end
|
100
|
+
|
101
|
+
def conversation_messages_list(id, limit=0, offset=0)
|
102
|
+
List.new(ConversationMessage, conversation_request(:get, "conversations/#{id}/messages?limit=#{limit}&offset=#{offset}"))
|
103
|
+
end
|
104
|
+
|
105
|
+
def conversation_message(id)
|
106
|
+
ConversationMessage.new(conversation_request(:get, "messages/#{id}"))
|
107
|
+
end
|
108
|
+
|
109
|
+
def conversation_webhook_create(channelId, url, events=[])
|
110
|
+
ConversationWebhook.new(conversation_request(
|
111
|
+
:post,
|
112
|
+
"webhooks",
|
113
|
+
:channelId => channelId,
|
114
|
+
:url => url,
|
115
|
+
:events => events
|
116
|
+
))
|
117
|
+
end
|
118
|
+
|
119
|
+
def conversation_webhooks_list(limit=0, offset=0)
|
120
|
+
List.new(ConversationWebhook, conversation_request(:get,"webhooks?limit=#{limit}&offset=#{offset}"))
|
121
|
+
end
|
122
|
+
|
123
|
+
def conversation_webhook_update(id, params={})
|
124
|
+
ConversationWebhook.new(conversation_request(:patch,"webhooks/#{id}",params))
|
125
|
+
end
|
126
|
+
|
127
|
+
def conversation_webhook(id)
|
128
|
+
ConversationWebhook.new(conversation_request(:get,"webhooks/#{id}"))
|
129
|
+
end
|
130
|
+
|
131
|
+
def conversation_webhook_delete(id)
|
132
|
+
conversation_request(:delete,"webhooks/#{id}")
|
133
|
+
end
|
134
|
+
|
50
135
|
# Retrieve your balance.
|
51
136
|
def balance
|
52
137
|
Balance.new(request(:get, 'balance'))
|
data/lib/messagebird/contact.rb
CHANGED
@@ -5,8 +5,8 @@ require 'messagebird/message_reference'
|
|
5
5
|
|
6
6
|
module MessageBird
|
7
7
|
class Contact < MessageBird::Base
|
8
|
-
attr_accessor :id, :href, :msisdn, :firstName, :lastName
|
9
|
-
|
8
|
+
attr_accessor :id, :href, :msisdn, :firstName, :lastName
|
9
|
+
attr_reader :customDetails, :groups, :messages, :createdDatetime, :updatedDatetime
|
10
10
|
|
11
11
|
def customDetails=(value)
|
12
12
|
@customDetails = MessageBird::CustomDetails.new(value)
|
@@ -28,4 +28,4 @@ module MessageBird
|
|
28
28
|
@updatedDatetime = value_to_time(value)
|
29
29
|
end
|
30
30
|
end
|
31
|
-
end
|
31
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'messagebird/base'
|
2
|
+
require 'messagebird/contact'
|
3
|
+
require 'messagebird/conversation_channel'
|
4
|
+
|
5
|
+
module MessageBird
|
6
|
+
class Conversation < MessageBird::Base
|
7
|
+
attr_accessor :id, :status, :lastUsedChannelId, :contactId
|
8
|
+
attr_reader :contact, :channels, :messages, :createdDatetime,
|
9
|
+
:updatedDatetime, :lastReceivedDatetime
|
10
|
+
|
11
|
+
CONVERSATION_STATUS_ACTIVE = 'active'
|
12
|
+
CONVERSATION_STATUS_ARCHIVED = 'archived'
|
13
|
+
WEBHOOK_EVENT_CONVERSATION_CREATED = 'conversation.created'
|
14
|
+
WEBHOOK_EVENT_CONVERSATION_UPDATED = 'conversation.updated'
|
15
|
+
WEBHOOK_EVENT_MESSAGE_CREATED = 'message.created'
|
16
|
+
WEBHOOK_EVENT_MESSAGE_UPDATED = 'message.updated'
|
17
|
+
|
18
|
+
def contact=(value)
|
19
|
+
@contact = Contact.new(value)
|
20
|
+
end
|
21
|
+
|
22
|
+
def channels=(json)
|
23
|
+
@channels = json.map { |c| MessageBird::ConversationChannel.new(c) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def messages=(value)
|
27
|
+
@messages = MessageBird::MessageReference.new(value)
|
28
|
+
end
|
29
|
+
|
30
|
+
def createdDatetime=(value)
|
31
|
+
@createdDatetime = value_to_time(value)
|
32
|
+
end
|
33
|
+
|
34
|
+
def updatedDatetime=(value)
|
35
|
+
@updatedDatetime = value_to_time(value)
|
36
|
+
end
|
37
|
+
|
38
|
+
def lastReceivedDatetime=(value)
|
39
|
+
@lastReceivedDatetime = value_to_time(value)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'messagebird/base'
|
2
|
+
|
3
|
+
module MessageBird
|
4
|
+
class ConversationChannel < MessageBird::Base
|
5
|
+
attr_accessor :id, :name, :platformId, :status
|
6
|
+
attr_reader :createdDatetime, :updatedDatetime
|
7
|
+
|
8
|
+
def createdDatetime=(value)
|
9
|
+
@createdDatetime = value_to_time(value)
|
10
|
+
end
|
11
|
+
|
12
|
+
def updatedDatetime=(value)
|
13
|
+
@updatedDatetime = value_to_time(value)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'net/https'
|
2
|
+
require 'uri'
|
3
|
+
require 'json'
|
4
|
+
require 'messagebird/http_client'
|
5
|
+
|
6
|
+
module MessageBird
|
7
|
+
class ConversationClient < HttpClient
|
8
|
+
ENDPOINT = 'https://conversations.messagebird.com/v1/'
|
9
|
+
|
10
|
+
def endpoint()
|
11
|
+
ENDPOINT
|
12
|
+
end
|
13
|
+
|
14
|
+
def prepare_request(request, params={})
|
15
|
+
request.body = params.to_json
|
16
|
+
request
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/messagebird/group.rb
CHANGED
@@ -3,8 +3,8 @@ require 'messagebird/contact_reference'
|
|
3
3
|
|
4
4
|
module MessageBird
|
5
5
|
class Group < MessageBird::Base
|
6
|
-
attr_accessor :id, :href, :name
|
7
|
-
|
6
|
+
attr_accessor :id, :href, :name
|
7
|
+
attr_reader :contacts, :createdDatetime, :updatedDatetime
|
8
8
|
|
9
9
|
def contacts=(value)
|
10
10
|
@contacts = MessageBird::ContactReference.new(value)
|
@@ -18,4 +18,4 @@ module MessageBird
|
|
18
18
|
@updatedDatetime = value_to_time(value)
|
19
19
|
end
|
20
20
|
end
|
21
|
-
end
|
21
|
+
end
|
data/lib/messagebird/hlr.rb
CHANGED
@@ -4,8 +4,8 @@ require 'messagebird/base'
|
|
4
4
|
|
5
5
|
module MessageBird
|
6
6
|
class HLR < MessageBird::Base
|
7
|
-
attr_accessor :id, :href, :msisdn, :network, :reference, :status,
|
8
|
-
|
7
|
+
attr_accessor :id, :href, :msisdn, :network, :reference, :status, :details
|
8
|
+
attr_reader :createdDatetime, :statusDatetime
|
9
9
|
|
10
10
|
def createdDatetime=(value)
|
11
11
|
@createdDatetime = value_to_time(value)
|
@@ -8,21 +8,30 @@ module MessageBird
|
|
8
8
|
class MethodNotAllowedException < ArgumentError; end
|
9
9
|
|
10
10
|
class HttpClient
|
11
|
-
|
12
11
|
attr_reader :access_key
|
13
12
|
|
13
|
+
ENDPOINT = 'https://rest.messagebird.com/'
|
14
|
+
|
14
15
|
def initialize(access_key)
|
15
16
|
@access_key = access_key
|
16
17
|
end
|
17
18
|
|
19
|
+
def endpoint()
|
20
|
+
ENDPOINT
|
21
|
+
end
|
22
|
+
|
18
23
|
def request(method, path, params={}, check_json=true)
|
19
|
-
uri = URI.join(
|
24
|
+
uri = URI.join(endpoint, path)
|
20
25
|
|
21
26
|
# Set up the HTTP object.
|
22
27
|
http = Net::HTTP.new(uri.host, uri.port)
|
23
|
-
http.use_ssl
|
28
|
+
http.use_ssl = true
|
29
|
+
|
30
|
+
unless ENV['DEBUG_MB_HTTP_CLIENT'].nil?
|
31
|
+
http.set_debug_output($stdout)
|
32
|
+
end
|
24
33
|
|
25
|
-
request =
|
34
|
+
request = build_request(method, uri, params)
|
26
35
|
|
27
36
|
# Execute the request and fetch the response.
|
28
37
|
response = http.request(request)
|
@@ -33,7 +42,12 @@ module MessageBird
|
|
33
42
|
response.body
|
34
43
|
end
|
35
44
|
|
36
|
-
def prepare_request(
|
45
|
+
def prepare_request(request, params={})
|
46
|
+
request.set_form_data(params)
|
47
|
+
request
|
48
|
+
end
|
49
|
+
|
50
|
+
def build_request(method, uri, params={})
|
37
51
|
# Construct the HTTP request.
|
38
52
|
case method
|
39
53
|
when :delete
|
@@ -52,8 +66,9 @@ module MessageBird
|
|
52
66
|
request['Authorization'] = "AccessKey #{@access_key}"
|
53
67
|
request['User-Agent'] = "MessageBird/ApiClient/#{CLIENT_VERSION} Ruby/#{RUBY_VERSION}"
|
54
68
|
|
55
|
-
|
56
|
-
|
69
|
+
if [:patch, :post].include?(method) && !params.empty?
|
70
|
+
prepare_request(request, params)
|
71
|
+
end
|
57
72
|
request
|
58
73
|
end
|
59
74
|
|
@@ -63,7 +78,7 @@ module MessageBird
|
|
63
78
|
# InvalidPhoneNumberException does not make a lot of sense here, but it's
|
64
79
|
# needed to maintain backwards compatibility. See issue:
|
65
80
|
# https://github.com/messagebird/ruby-rest-api/issues/17
|
66
|
-
expected_codes = [200, 201, 204, 401, 404, 405, 422]
|
81
|
+
expected_codes = [200, 201, 202, 204, 401, 404, 405, 422]
|
67
82
|
raise InvalidPhoneNumberException, 'Unknown response from server' unless expected_codes.include? code
|
68
83
|
end
|
69
84
|
|
@@ -77,4 +92,4 @@ module MessageBird
|
|
77
92
|
|
78
93
|
end
|
79
94
|
|
80
|
-
end
|
95
|
+
end
|
data/lib/messagebird/list.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'messagebird/base'
|
2
2
|
|
3
3
|
class List < MessageBird::Base
|
4
|
-
|
5
4
|
attr_accessor :offset, :limit, :count, :totalCount, :links, :items
|
6
5
|
|
7
6
|
# type will be used to create objects for the items, e.g.
|
@@ -20,4 +19,4 @@ class List < MessageBird::Base
|
|
20
19
|
@items[index]
|
21
20
|
end
|
22
21
|
|
23
|
-
end
|
22
|
+
end
|
data/lib/messagebird/message.rb
CHANGED
@@ -3,9 +3,9 @@ require 'messagebird/recipient'
|
|
3
3
|
|
4
4
|
module MessageBird
|
5
5
|
class Message < MessageBird::Base
|
6
|
-
attr_accessor :id, :href, :direction, :type, :originator, :body,
|
7
|
-
:
|
8
|
-
|
6
|
+
attr_accessor :id, :href, :direction, :type, :originator, :body, :reference,
|
7
|
+
:validity, :gateway, :typeDetails, :datacoding, :mclass
|
8
|
+
attr_reader :scheduledDatetime, :createdDatetime, :recipients
|
9
9
|
|
10
10
|
def scheduledDatetime=(value)
|
11
11
|
@scheduledDatetime = value_to_time(value)
|
@@ -2,7 +2,8 @@ require 'messagebird/base'
|
|
2
2
|
|
3
3
|
module MessageBird
|
4
4
|
class Recipient < MessageBird::Base
|
5
|
-
attr_accessor :recipient, :status
|
5
|
+
attr_accessor :recipient, :status
|
6
|
+
attr_reader :statusDatetime
|
6
7
|
|
7
8
|
def statusDatetime=(value)
|
8
9
|
@statusDatetime = value_to_time(value)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require 'digest'
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
module MessageBird
|
6
|
+
class ValidationException < TypeError;
|
7
|
+
end
|
8
|
+
|
9
|
+
class SignedRequest
|
10
|
+
def initialize(queryParameters, signature, requestTimestamp, body)
|
11
|
+
|
12
|
+
if !queryParameters.is_a? Hash
|
13
|
+
raise ValidationException, 'The "queryParameters" value is invalid.'
|
14
|
+
end
|
15
|
+
if !signature.is_a? String
|
16
|
+
raise ValidationException, 'The "signature" value is invalid.'
|
17
|
+
end
|
18
|
+
if !requestTimestamp.is_a? Integer
|
19
|
+
raise ValidationException, 'The "requestTimestamp" value is invalid.'
|
20
|
+
end
|
21
|
+
if !body.is_a? String
|
22
|
+
raise ValidationException, 'The "body" value is invalid.'
|
23
|
+
end
|
24
|
+
|
25
|
+
@queryParameters, @signature, @requestTimestamp, @body = queryParameters, signature, requestTimestamp, body
|
26
|
+
end
|
27
|
+
|
28
|
+
def verify(signingKey)
|
29
|
+
calculatedSignature = OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), signingKey, buildPayload)
|
30
|
+
expectedSignature = Base64.decode64(@signature)
|
31
|
+
calculatedSignature.bytes == expectedSignature.bytes
|
32
|
+
end
|
33
|
+
|
34
|
+
def buildPayload
|
35
|
+
parts = []
|
36
|
+
parts.push(@requestTimestamp)
|
37
|
+
parts.push(URI.encode_www_form(@queryParameters.sort))
|
38
|
+
parts.push(Digest::SHA256.new.digest @body)
|
39
|
+
parts.join("\n")
|
40
|
+
end
|
41
|
+
|
42
|
+
def isRecent(offset = 10)
|
43
|
+
(Time.now.getutc.to_i - @requestTimestamp) < offset;
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
data/lib/messagebird/verify.rb
CHANGED
@@ -4,8 +4,8 @@ require 'messagebird/base'
|
|
4
4
|
|
5
5
|
module MessageBird
|
6
6
|
class Verify < MessageBird::Base
|
7
|
-
attr_accessor :id, :recipient, :reference, :status, :href
|
8
|
-
|
7
|
+
attr_accessor :id, :recipient, :reference, :status, :href
|
8
|
+
attr_reader :createdDatetime, :validUntilDatetime
|
9
9
|
|
10
10
|
def createdDatetime=(value)
|
11
11
|
@createdDatetime = value_to_time(value)
|
@@ -3,9 +3,8 @@ require 'messagebird/recipient'
|
|
3
3
|
|
4
4
|
module MessageBird
|
5
5
|
class VoiceMessage < MessageBird::Base
|
6
|
-
attr_accessor :id, :href, :originator, :body, :reference, :language, :voice, :repeat,
|
7
|
-
|
8
|
-
|
6
|
+
attr_accessor :id, :href, :originator, :body, :reference, :language, :voice, :repeat, :ifMachine
|
7
|
+
attr_reader :scheduledDatetime, :createdDatetime, :recipients
|
9
8
|
|
10
9
|
def scheduledDatetime=(value)
|
11
10
|
@scheduledDatetime = value_to_time(value)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: messagebird-rest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maurice Nonnekes
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-07-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -38,6 +38,11 @@ files:
|
|
38
38
|
- lib/messagebird/client.rb
|
39
39
|
- lib/messagebird/contact.rb
|
40
40
|
- lib/messagebird/contact_reference.rb
|
41
|
+
- lib/messagebird/conversation.rb
|
42
|
+
- lib/messagebird/conversation_channel.rb
|
43
|
+
- lib/messagebird/conversation_client.rb
|
44
|
+
- lib/messagebird/conversation_message.rb
|
45
|
+
- lib/messagebird/conversation_webhook.rb
|
41
46
|
- lib/messagebird/custom_details.rb
|
42
47
|
- lib/messagebird/error.rb
|
43
48
|
- lib/messagebird/group.rb
|
@@ -49,6 +54,7 @@ files:
|
|
49
54
|
- lib/messagebird/message.rb
|
50
55
|
- lib/messagebird/message_reference.rb
|
51
56
|
- lib/messagebird/recipient.rb
|
57
|
+
- lib/messagebird/signed_request.rb
|
52
58
|
- lib/messagebird/verify.rb
|
53
59
|
- lib/messagebird/voicemessage.rb
|
54
60
|
homepage: https://github.com/messagebird/ruby-rest-api
|