moceansdk 0.1.6 → 1.1.1
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 +5 -5
- data/LICENSE.txt +1 -1
- data/README.md +75 -57
- data/lib/moceansdk.rb +51 -5
- data/lib/moceansdk/auth/abstract_auth.rb +15 -0
- data/lib/moceansdk/auth/basic.rb +29 -0
- data/lib/moceansdk/client.rb +70 -14
- data/lib/moceansdk/exceptions/mocean_error.rb +18 -0
- data/lib/moceansdk/exceptions/required_field_exception.rb +8 -0
- data/lib/moceansdk/modules/abstact_client.rb +54 -0
- data/lib/moceansdk/modules/account/balance.rb +26 -22
- data/lib/moceansdk/modules/account/pricing.rb +37 -37
- data/lib/moceansdk/modules/command/command.rb +47 -0
- data/lib/moceansdk/modules/command/mc.rb +40 -0
- data/lib/moceansdk/modules/command/mc_builder.rb +30 -0
- data/lib/moceansdk/modules/command/mc_object/abstract_mc.rb +36 -0
- data/lib/moceansdk/modules/command/mc_object/send_sms.rb +41 -0
- data/lib/moceansdk/modules/command/mc_object/tg_request_contact.rb +49 -0
- data/lib/moceansdk/modules/command/mc_object/tg_send_animation.rb +41 -0
- data/lib/moceansdk/modules/command/mc_object/tg_send_audio.rb +41 -0
- data/lib/moceansdk/modules/command/mc_object/tg_send_document.rb +41 -0
- data/lib/moceansdk/modules/command/mc_object/tg_send_photo.rb +41 -0
- data/lib/moceansdk/modules/command/mc_object/tg_send_text.rb +41 -0
- data/lib/moceansdk/modules/command/mc_object/tg_send_video.rb +41 -0
- data/lib/moceansdk/modules/message/channel.rb +13 -0
- data/lib/moceansdk/modules/message/message_status.rb +29 -24
- data/lib/moceansdk/modules/message/sms.rb +74 -96
- data/lib/moceansdk/modules/message/verify_request.rb +83 -58
- data/lib/moceansdk/modules/message/verify_validate.rb +33 -37
- data/lib/moceansdk/modules/number_lookup/number_lookup.rb +34 -0
- data/lib/moceansdk/modules/response_factory.rb +50 -0
- data/lib/moceansdk/modules/transmitter.rb +112 -0
- data/lib/moceansdk/modules/voice/mc.rb +63 -0
- data/lib/moceansdk/modules/voice/mc_builder.rb +30 -0
- data/lib/moceansdk/modules/voice/mc_object/abstract_mc.rb +38 -0
- data/lib/moceansdk/modules/voice/mc_object/collect.rb +39 -0
- data/lib/moceansdk/modules/voice/mc_object/dial.rb +31 -0
- data/lib/moceansdk/modules/voice/mc_object/play.rb +31 -0
- data/lib/moceansdk/modules/voice/mc_object/record.rb +19 -0
- data/lib/moceansdk/modules/voice/mc_object/say.rb +43 -0
- data/lib/moceansdk/modules/voice/mc_object/sleep.rb +23 -0
- data/lib/moceansdk/modules/voice/voice.rb +84 -0
- data/lib/moceansdk/utils.rb +15 -0
- data/lib/moceansdk/version.rb +1 -1
- data/moceansdk.gemspec +13 -6
- metadata +97 -19
- data/lib/moceansdk/init.rb +0 -4
- data/lib/moceansdk/mocean.rb +0 -52
- data/lib/moceansdk/modules/abstract.rb +0 -142
@@ -1,38 +1,34 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
response = Transmitter.new('/rest/1/verify/check','post',@params)
|
35
|
-
return response.getResponse()
|
36
|
-
end
|
37
|
-
|
1
|
+
module Moceansdk
|
2
|
+
module Modules
|
3
|
+
module Message
|
4
|
+
|
5
|
+
class VerifyValidate < Moceansdk::Modules::AbstractClient
|
6
|
+
def initialize(obj_auth, transmitter)
|
7
|
+
super(obj_auth, transmitter)
|
8
|
+
@required_fields = ['mocean-api-key', 'mocean-api-secret', 'mocean-reqid', 'mocean-code']
|
9
|
+
end
|
10
|
+
|
11
|
+
def reqid=(param)
|
12
|
+
@params['mocean-reqid'] = param
|
13
|
+
end
|
14
|
+
|
15
|
+
def code=(param)
|
16
|
+
@params['mocean-code'] = param
|
17
|
+
end
|
18
|
+
|
19
|
+
def resp_format=(param)
|
20
|
+
@params['mocean-resp-format'] = param
|
21
|
+
end
|
22
|
+
|
23
|
+
def send(params = {})
|
24
|
+
create(params)
|
25
|
+
create_final_params
|
26
|
+
required_field_set?
|
27
|
+
|
28
|
+
@transmitter.post('/verify/check', @params)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
38
34
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Moceansdk
|
2
|
+
module Modules
|
3
|
+
module NumberLookup
|
4
|
+
|
5
|
+
class NumberLookup < Moceansdk::Modules::AbstractClient
|
6
|
+
def initialize(obj_auth, transmitter)
|
7
|
+
super(obj_auth, transmitter)
|
8
|
+
@required_fields = ['mocean-api-key', 'mocean-api-secret', 'mocean-to']
|
9
|
+
end
|
10
|
+
|
11
|
+
def to=(param)
|
12
|
+
@params['mocean-to'] = param
|
13
|
+
end
|
14
|
+
|
15
|
+
def nl_url=(param)
|
16
|
+
@params['mocean-nl-url'] = param
|
17
|
+
end
|
18
|
+
|
19
|
+
def resp_format=(param)
|
20
|
+
@params['mocean-resp-format'] = param
|
21
|
+
end
|
22
|
+
|
23
|
+
def inquiry(params = {})
|
24
|
+
create(params)
|
25
|
+
create_final_params
|
26
|
+
required_field_set?
|
27
|
+
|
28
|
+
@transmitter.post('/nl', @params)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Moceansdk
|
2
|
+
module Modules
|
3
|
+
|
4
|
+
class ResponseFactory
|
5
|
+
def self.create_object(raw_response)
|
6
|
+
begin
|
7
|
+
res = JSON.load(raw_response, proc {|obj|
|
8
|
+
case obj
|
9
|
+
when Hash
|
10
|
+
obj.each {|k, v|
|
11
|
+
obj[k] = if v.is_a? Float
|
12
|
+
# hardcoded float to 4 decimal string
|
13
|
+
sprintf('%.4f', v)
|
14
|
+
elsif v.is_a? Integer
|
15
|
+
v.to_s
|
16
|
+
else
|
17
|
+
v
|
18
|
+
end
|
19
|
+
}
|
20
|
+
when Array
|
21
|
+
obj.map! {|v| v}
|
22
|
+
end
|
23
|
+
})
|
24
|
+
rescue JSON::JSONError
|
25
|
+
begin
|
26
|
+
res = XmlSimple.xml_in(raw_response, 'ForceArray': false)
|
27
|
+
rescue StandardError
|
28
|
+
raise Moceansdk::Exceptions::MoceanError, 'unable to parse response, ' + raw_response
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
hashed_res = HashExtended.new.merge(res)
|
33
|
+
hashed_res.to_dot
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class HashExtended < Hash
|
38
|
+
attr_accessor :raw_response
|
39
|
+
|
40
|
+
def to_s
|
41
|
+
@raw_response
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_hash
|
45
|
+
inspect
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module Moceansdk
|
2
|
+
module Modules
|
3
|
+
|
4
|
+
class Transmitter
|
5
|
+
def initialize(options = nil)
|
6
|
+
@options = default_options
|
7
|
+
|
8
|
+
unless options.nil?
|
9
|
+
@options = @options.merge(options)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def default_options
|
14
|
+
{
|
15
|
+
base_url: 'https://rest.moceanapi.com',
|
16
|
+
version: '2',
|
17
|
+
verify_ssl: true
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def get(uri, params)
|
22
|
+
request_and_parse_body('get', uri, params)
|
23
|
+
end
|
24
|
+
|
25
|
+
def post(uri, params)
|
26
|
+
request_and_parse_body('post', uri, params)
|
27
|
+
end
|
28
|
+
|
29
|
+
def request_and_parse_body(method, uri, params)
|
30
|
+
res = request(method, uri, params)
|
31
|
+
|
32
|
+
format_response(res.to_s, params[:'mocean-resp-format'] == 'xml', uri)
|
33
|
+
end
|
34
|
+
|
35
|
+
def request(method, uri, params)
|
36
|
+
params[:'mocean-medium'] = 'RUBY-SDK'
|
37
|
+
|
38
|
+
# use json if default not set
|
39
|
+
params[:'mocean-resp-format'] = 'json' unless params[:'mocean-resp-format']
|
40
|
+
|
41
|
+
url = @options[:base_url] + '/rest/' + @options[:version] + uri
|
42
|
+
|
43
|
+
if method.casecmp('get').zero?
|
44
|
+
HTTP.follow.get(url, params: params, ssl_context: make_ssl_context)
|
45
|
+
else
|
46
|
+
HTTP.post(url, form: params, ssl_context: make_ssl_context)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def format_response(response_text, is_xml = false, uri = nil)
|
51
|
+
raw_response = response_text
|
52
|
+
|
53
|
+
# format for v1
|
54
|
+
if !uri.nil? && @options[:version] == '1' && is_xml
|
55
|
+
if uri == '/account/pricing'
|
56
|
+
response_text = response_text
|
57
|
+
.sub('<data>', '<destinations>')
|
58
|
+
.sub('</data>', '</destinations>')
|
59
|
+
elsif uri == '/sms'
|
60
|
+
response_text = response_text
|
61
|
+
.sub('<result>', '<result><messages>')
|
62
|
+
.sub('</result>', '</messages></result>')
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
processed_response = ResponseFactory.create_object(
|
67
|
+
response_text
|
68
|
+
.sub('<verify_request>', '')
|
69
|
+
.sub('</verify_request>', '')
|
70
|
+
.sub('<verify_check>', '')
|
71
|
+
.sub('</verify_check>', '')
|
72
|
+
)
|
73
|
+
|
74
|
+
if processed_response['status'] && processed_response['status'] != '0' && processed_response['status'] != 0
|
75
|
+
processed_response.raw_response = raw_response
|
76
|
+
raise Moceansdk::Exceptions::MoceanError.new(processed_response['err_msg'], processed_response)
|
77
|
+
end
|
78
|
+
|
79
|
+
# format for v1
|
80
|
+
if !uri.nil? && is_xml
|
81
|
+
if uri == '/account/pricing'
|
82
|
+
processed_response.destinations = processed_response.destinations.destination
|
83
|
+
elsif uri == '/sms'
|
84
|
+
unless processed_response.messages.message.is_a? Array
|
85
|
+
processed_response.messages.message = [processed_response.messages.message]
|
86
|
+
end
|
87
|
+
processed_response.messages = processed_response.messages.message
|
88
|
+
elsif uri == '/voice/dial'
|
89
|
+
unless processed_response.calls.call.is_a? Array
|
90
|
+
processed_response.calls.call = [processed_response.calls.call]
|
91
|
+
end
|
92
|
+
processed_response.calls = processed_response.calls.call
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
processed_response.raw_response = raw_response
|
97
|
+
processed_response
|
98
|
+
end
|
99
|
+
|
100
|
+
def make_ssl_context
|
101
|
+
if @options[:verify_ssl]
|
102
|
+
return nil
|
103
|
+
end
|
104
|
+
|
105
|
+
ctx = OpenSSL::SSL::SSLContext.new
|
106
|
+
ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
107
|
+
ctx
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Moceansdk
|
2
|
+
module Modules
|
3
|
+
module Voice
|
4
|
+
|
5
|
+
class Mc
|
6
|
+
def self.say(text = nil)
|
7
|
+
ins = McObject::Say.new
|
8
|
+
|
9
|
+
unless text.nil?
|
10
|
+
ins.text = text
|
11
|
+
end
|
12
|
+
|
13
|
+
ins
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.play(file = nil)
|
17
|
+
ins = McObject::Play.new
|
18
|
+
|
19
|
+
unless file.nil?
|
20
|
+
ins.files = file
|
21
|
+
end
|
22
|
+
|
23
|
+
ins
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.dial(to = nil)
|
27
|
+
ins = McObject::Dial.new
|
28
|
+
|
29
|
+
unless to.nil?
|
30
|
+
ins.to = to
|
31
|
+
end
|
32
|
+
|
33
|
+
ins
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.collect(event_url = nil)
|
37
|
+
ins = McObject::Collect.new
|
38
|
+
|
39
|
+
unless event_url.nil?
|
40
|
+
ins.event_url = event_url
|
41
|
+
end
|
42
|
+
|
43
|
+
ins
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.sleep(duration = nil)
|
47
|
+
ins = McObject::Sleep.new
|
48
|
+
|
49
|
+
unless duration.nil?
|
50
|
+
ins.duration = duration
|
51
|
+
end
|
52
|
+
|
53
|
+
ins
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.record
|
57
|
+
McObject::Record.new
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Moceansdk
|
2
|
+
module Modules
|
3
|
+
module Voice
|
4
|
+
|
5
|
+
class McBuilder
|
6
|
+
def initialize
|
7
|
+
@mc = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def add(mc)
|
11
|
+
unless mc.is_a? McObject::AbstractMc
|
12
|
+
raise Moceansdk::Exceptions::MoceanError, 'mc_object must extend AbstractMc'
|
13
|
+
end
|
14
|
+
|
15
|
+
@mc.push(mc)
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def build
|
20
|
+
converted = []
|
21
|
+
@mc.each do |mc|
|
22
|
+
converted.push(mc.get_request_data)
|
23
|
+
end
|
24
|
+
converted
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Moceansdk
|
2
|
+
module Modules
|
3
|
+
module Voice
|
4
|
+
module McObject
|
5
|
+
|
6
|
+
class AbstractMc
|
7
|
+
def initialize(params = nil)
|
8
|
+
@params = {}
|
9
|
+
|
10
|
+
@params = Moceansdk::Utils.convert_to_symbol_hash(params) unless params.nil?
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_request_data
|
14
|
+
@params = Moceansdk::Utils.convert_to_symbol_hash(@params)
|
15
|
+
|
16
|
+
required_key.each do |key|
|
17
|
+
if @params[:"#{key}"].nil?
|
18
|
+
raise Moceansdk::Exceptions::RequiredFieldException, "#{key} is mandatory field, can't leave empty (#{self})"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
@params[:action] = action
|
23
|
+
@params
|
24
|
+
end
|
25
|
+
|
26
|
+
def required_key
|
27
|
+
raise NotImplementedError, 'AbstractMc is a abstract class'
|
28
|
+
end
|
29
|
+
|
30
|
+
def action
|
31
|
+
raise NotImplementedError, 'AbstractMc is a abstract class'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Moceansdk
|
2
|
+
module Modules
|
3
|
+
module Voice
|
4
|
+
module McObject
|
5
|
+
|
6
|
+
class Collect < AbstractMc
|
7
|
+
def event_url=(param)
|
8
|
+
@params[:'event-url'] = param
|
9
|
+
end
|
10
|
+
|
11
|
+
def minimum=(param)
|
12
|
+
@params[:min] = param
|
13
|
+
end
|
14
|
+
|
15
|
+
def maximum=(param)
|
16
|
+
@params[:max] = param
|
17
|
+
end
|
18
|
+
|
19
|
+
def terminators=(param)
|
20
|
+
@params[:terminators] = param
|
21
|
+
end
|
22
|
+
|
23
|
+
def timeout=(param)
|
24
|
+
@params[:timeout] = param
|
25
|
+
end
|
26
|
+
|
27
|
+
def required_key
|
28
|
+
['event-url', 'min', 'max', 'timeout']
|
29
|
+
end
|
30
|
+
|
31
|
+
def action
|
32
|
+
'collect'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|