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