telapi 1.0.0

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 (49) hide show
  1. data/.gitignore +20 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +22 -0
  4. data/README.md +162 -0
  5. data/Rakefile +1 -0
  6. data/lib/telapi.rb +24 -0
  7. data/lib/telapi/account.rb +14 -0
  8. data/lib/telapi/application.rb +88 -0
  9. data/lib/telapi/available_phone_number.rb +24 -0
  10. data/lib/telapi/call.rb +214 -0
  11. data/lib/telapi/caller_id.rb +16 -0
  12. data/lib/telapi/carrier.rb +16 -0
  13. data/lib/telapi/conference.rb +206 -0
  14. data/lib/telapi/configuration.rb +40 -0
  15. data/lib/telapi/error.rb +22 -0
  16. data/lib/telapi/fraud.rb +79 -0
  17. data/lib/telapi/inbound_xml.rb +36 -0
  18. data/lib/telapi/incoming_phone_number.rb +86 -0
  19. data/lib/telapi/message.rb +47 -0
  20. data/lib/telapi/network.rb +50 -0
  21. data/lib/telapi/notification.rb +29 -0
  22. data/lib/telapi/recording.rb +69 -0
  23. data/lib/telapi/resource.rb +18 -0
  24. data/lib/telapi/resource_collection.rb +38 -0
  25. data/lib/telapi/transcription.rb +44 -0
  26. data/lib/telapi/version.rb +3 -0
  27. data/spec/spec_helper.rb +17 -0
  28. data/spec/support/telapi_helpers.rb +38 -0
  29. data/spec/telapi/account_spec.rb +17 -0
  30. data/spec/telapi/application_spec.rb +69 -0
  31. data/spec/telapi/available_phone_number_spec.rb +27 -0
  32. data/spec/telapi/call_spec.rb +173 -0
  33. data/spec/telapi/caller_id_spec.rb +17 -0
  34. data/spec/telapi/carrier_spec.rb +17 -0
  35. data/spec/telapi/conference_spec.rb +174 -0
  36. data/spec/telapi/configuration_spec.rb +38 -0
  37. data/spec/telapi/error_spec.rb +32 -0
  38. data/spec/telapi/fraud_spec.rb +55 -0
  39. data/spec/telapi/inbound_xml_spec.rb +49 -0
  40. data/spec/telapi/incoming_phone_number_spec.rb +69 -0
  41. data/spec/telapi/message_spec.rb +41 -0
  42. data/spec/telapi/network_spec.rb +80 -0
  43. data/spec/telapi/notification_spec.rb +34 -0
  44. data/spec/telapi/recording_spec.rb +72 -0
  45. data/spec/telapi/resource_collection_spec.rb +64 -0
  46. data/spec/telapi/resource_spec.rb +25 -0
  47. data/spec/telapi/transcription_spec.rb +41 -0
  48. data/telapi-ruby.gemspec +32 -0
  49. metadata +227 -0
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .DS_Store
4
+ .bundle
5
+ .config
6
+ .rspec
7
+ .yardoc
8
+ Gemfile.lock
9
+ InstalledFiles
10
+ _yardoc
11
+ bin
12
+ coverage
13
+ doc/
14
+ lib/bundler/man
15
+ pkg
16
+ rdoc
17
+ spec/reports
18
+ test/tmp
19
+ test/version_tmp
20
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in telapi-ruby.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Phil Misiowiec
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,162 @@
1
+ # Telapi::Ruby
2
+
3
+ See www.telapi.com to signup for TelAPI.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'telapi'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install telapi
18
+
19
+ ## Authentication and Configuration
20
+
21
+ Every API request requires a valid *account_sid* and *auth_token*. By default these are set to *nil*, so your application
22
+ should set them in its configuration (e.g. Ruby on Rails initializer).
23
+
24
+ For example:
25
+
26
+ Telapi.config do |config|
27
+ config.account_sid = 'abc123'
28
+ config.auth_token = 'xyz567'
29
+ end
30
+
31
+ You can also set individual settings directly:
32
+
33
+ Telapi.config.ssl_ca_path = '/some/path'
34
+
35
+ Inspecting the current configuration returns a hash:
36
+
37
+ p Telapi.config # (or Telapi.config.inspect)
38
+ #=> {:base_uri=>"https://api.telapi.com/2011-07-01/", :ssl_ca_path=>"/some/path", :account_sid=>'abc123', :auth_token=>'xyz567'}
39
+
40
+ ## Design
41
+
42
+ Minimal code is needed to retrieve objects and perform operations. There's no need to instantiate a client object -- work directly with the desired classes.
43
+
44
+ Most classes provide identically named class and instance methods for ultimate flexibility. For example, to hang up an existing call, you can call either of the following:
45
+
46
+ call = Telapi::Call.get('123abc')
47
+ call.hangup
48
+
49
+ # avoids an additional network request
50
+ Telapi::Call.hangup('123abc')
51
+
52
+ Individual objects are wrapped into a Resource instance, which exposes all of the attributes documented in the [TelAPI documentation](http://www.telapi.com/docs/) as accessors and avoids the need to deal with direct JSON responses in your application code. A convenient *attributes* method allows you to dump out the object's values.
53
+
54
+ Telapi::Account.get.attributes
55
+ # => { ...hash of keys and values... }
56
+
57
+ Methods that return collections wrap Resource objects in a Resource Collection instance, which behaves similar to an Array, but also includes meta info about totals, page size, current page, etc.
58
+
59
+ ## Documentation
60
+
61
+ Detailed documentation can be found at [RubyDoc](http://rubydoc.info/gems/telapi/) and [the official TelAPI documentation site](http://www.telapi.com/docs/).
62
+
63
+ ## Usage Examples - REST API
64
+
65
+ Refer to the documentation for more examples.
66
+
67
+ ### Get account details
68
+
69
+ acct = Telapi::Account.get
70
+ acct.friendly_name # => "My Account"
71
+ acct.account_balance # => "25.000"
72
+
73
+ ### Get available numbers
74
+
75
+ numbers = Telapi::AvailablePhoneNumber.list('US', :AreaCode => '805')
76
+ numbers.each { |n| puts n.phone_number }
77
+ # => +18052585701
78
+ # +18052585702
79
+
80
+ ### Get list of calls
81
+
82
+ Telapi::Call.list # => returns ResouceCollection of Telapi::Call objects
83
+
84
+ ### Make a call
85
+
86
+ Telapi::Call.make('12223334444', '13334445555', 'http://mycallback...')
87
+
88
+ ### Record a call
89
+
90
+ call = Telapi::Call.get('123abc')
91
+ call.record
92
+
93
+ # or invoke the class method to avoid an additional network request
94
+ Telapi::Call.record('123abc')
95
+
96
+ ### Send an SMS message
97
+
98
+ Telapi::Message.create('12223334444', '13334445555', 'Hey you')
99
+
100
+ ### Transcribe audio
101
+
102
+ Telapi::Transcription.transcribe_audio('http://some-audio-url')
103
+
104
+ ### Caller ID
105
+
106
+ Telapi::CallerId.lookup('12223334444')
107
+
108
+ ## Usage Examples - Inbound XML
109
+
110
+ ### Say
111
+
112
+ ix = Telapi::InboundXml.new do
113
+ Say('Hello.', :loop => 3, :voice => 'man')
114
+ Say('Hello, my name is Jane.', :voice => 'woman')
115
+ Say('Now I will not stop talking.', :loop => 0)
116
+ end
117
+
118
+ ix.response
119
+
120
+ # results in the following XML:
121
+ # <?xml version="1.0"?>
122
+ # <Response>
123
+ # <Say loop="3" voice="man">Hello.</Say>
124
+ # <Say voice="woman">Hello, my name is Jane.</Say>
125
+ # <Say loop="0">Now I will not stop talking.</Say>
126
+ # </Response>
127
+
128
+ ### Play
129
+
130
+ Telapi::InboundXml.new { Play('http://example.com/hello.mp3', :loop => 3) }
131
+
132
+ ### Gather
133
+
134
+ Telapi::InboundXml.new do
135
+ Gather(:action => 'http://example.com/example-callback-url/say?example=simple.xml',
136
+ :method => 'GET',
137
+ :numDigits => '4',
138
+ :finishOnKey => '#') {
139
+ Say 'Please enter your 4 digit pin.'
140
+ }
141
+ end
142
+
143
+ ### SMS Response
144
+
145
+ Telapi::InboundXml.new do
146
+ Sms(
147
+ 'Test message sent from TelAPI!',
148
+ :action => 'http://liveoutput.com/telapi-test-sms-action',
149
+ :method => 'POST',
150
+ :from => '1112223333',
151
+ :to => '3334445555',
152
+ :statusCallback => 'http://liveoutput.com/telapi-test-status-callback'
153
+ )
154
+ end
155
+
156
+ ## Contributing
157
+
158
+ 1. Fork it
159
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
160
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
161
+ 4. Push to the branch (`git push origin my-new-feature`)
162
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,24 @@
1
+ require 'telapi/version'
2
+
3
+ require 'telapi/error'
4
+ require 'telapi/configuration'
5
+ require 'telapi/network'
6
+
7
+ require 'telapi/resource'
8
+ require 'telapi/resource_collection'
9
+
10
+ require 'telapi/account'
11
+ require 'telapi/application'
12
+ require 'telapi/available_phone_number'
13
+ require 'telapi/call'
14
+ require 'telapi/caller_id'
15
+ require 'telapi/carrier'
16
+ require 'telapi/conference'
17
+ require 'telapi/fraud'
18
+ require 'telapi/incoming_phone_number'
19
+ require 'telapi/message'
20
+ require 'telapi/notification'
21
+ require 'telapi/recording'
22
+ require 'telapi/transcription'
23
+
24
+ require 'telapi/inbound_xml'
@@ -0,0 +1,14 @@
1
+ module Telapi
2
+ # Wraps TelAPI Account functionality
3
+ class Account < Resource
4
+ class << self
5
+
6
+ # Gets current Telapi account as a Telapi::Account object
7
+ # See http://www.telapi.com/docs/api/rest/accounts/view/
8
+ def get
9
+ Account.new(Network.get)
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,88 @@
1
+ module Telapi
2
+ # Wraps TelAPI Application functionality
3
+ class Application < Resource
4
+ class << self
5
+
6
+ # Returns a resource collection containing Telapi::Application objects
7
+ # See http://www.telapi.com/docs/api/rest/applications/list/
8
+ #
9
+ # Optional params is a hash containing:
10
+ # +FriendlyName+:: string
11
+ # +Page+:: integer greater than 0
12
+ # +PageSize+:: integer greater than 0
13
+ def list(optional_params = {})
14
+ response = Network.get(['Applications'], optional_params)
15
+ ResourceCollection.new(response, 'applications', self)
16
+ end
17
+
18
+ # Returns a Telapi::Application object given its id
19
+ # See http://www.telapi.com/docs/api/rest/applications/view/
20
+ def get(id)
21
+ response = Network.get(['Applications', id])
22
+ Application.new(response)
23
+ end
24
+
25
+ # Creates an application, returning a Telapi::Application object
26
+ # See http://www.telapi.com/docs/api/rest/applications/create/
27
+ #
28
+ # Required params:
29
+ # +name+:: string
30
+ #
31
+ # Optional params is a hash containing:
32
+ # +VoiceUrl+:: valid URL
33
+ # +VoiceMethod+:: (POST) or GET
34
+ # +VoiceFallbackUrl+:: valid URL
35
+ # +VoiceFallbackMethod+:: (POST) or GET
36
+ # +VoiceCallerIdLookup+:: true or (false)
37
+ # +SmsUrl+:: valid URL
38
+ # +SmsMethod+:: (POST) or GET
39
+ # +SmsFallbackUrl+:: valid URL
40
+ # +SmsFallbackMethod+:: (POST) or GET
41
+ # +HeartbeatUrl+:: valid URL
42
+ # +HeartbeatMethod+:: (POST) or GET
43
+ # +StatusCallback+:: valid URL
44
+ # +StatusCallbackMethod+:: (POST) or GET
45
+ def create(name, optional_params = {})
46
+ opts = { :FriendlyName => name }.merge(optional_params)
47
+ response = Network.post(['Applications'], opts)
48
+ Application.new(response)
49
+ end
50
+
51
+ # Updates an application, returning a Telapi::Application object
52
+ # See http://www.telapi.com/docs/api/rest/applications/update/
53
+ #
54
+ # Required params:
55
+ # +id+:: application id
56
+ #
57
+ # Optional params is a hash supporting same options under ::create
58
+ # in addition to:
59
+ # +FriendlyName+:: string
60
+ def update(id, optional_params = {})
61
+ response = Network.post(['Applications', id], optional_params)
62
+ Application.new(response)
63
+ end
64
+
65
+ # Deletes an application, returning a Telapi::Application object
66
+ # See http://www.telapi.com/docs/api/rest/applications/delete/
67
+ #
68
+ # Required params:
69
+ # +id+:: application id
70
+ def delete(id)
71
+ response = Network.delete(['Applications', id])
72
+ Application.new(response)
73
+ end
74
+
75
+ end
76
+
77
+ # See ::update
78
+ def update(optional_params = {})
79
+ self.class.update(self.sid, optional_params)
80
+ end
81
+
82
+ # See ::delete
83
+ def delete(optional_params = {})
84
+ self.class.delete(self.sid)
85
+ end
86
+
87
+ end
88
+ end
@@ -0,0 +1,24 @@
1
+ module Telapi
2
+ # Wraps TelAPI Available Phone Number functionality
3
+ class AvailablePhoneNumber < Resource
4
+ class << self
5
+
6
+ # Returns a resource collection containing Telapi::AvailablePhoneNumber objects
7
+ # See http://www.telapi.com/docs/api/rest/available-phone-numbers/list/
8
+ #
9
+ # Required params:
10
+ # +country_code_iso+:: country code (ISO), see http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
11
+ #
12
+ # Optional params is a hash containing:
13
+ # +AreaCode+:: valid area code, e.g. 415
14
+ # +Contains+:: 0-9, lower and upper case letters of the alphabet (Aa-Zz), or *
15
+ # +InRegion+:: valid region (state or province) abbreviation
16
+ # +InPostalCode+:: valid postal code
17
+ def list(country_code_iso, optional_params = {})
18
+ response = Network.get(['AvailablePhoneNumbers', country_code_iso, 'Local'], optional_params)
19
+ ResourceCollection.new(response, 'available_phone_numbers', self)
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,214 @@
1
+ module Telapi
2
+ # Wraps TelAPI Call functionality
3
+ class Call < Resource
4
+ class << self
5
+
6
+ # Returns a resource collection containing Telapi::Call objects
7
+ # See http://www.telapi.com/docs/api/rest/calls/list/
8
+ #
9
+ # Optional params is a hash containing:
10
+ # +To+:: phone number, e.g. 7325551234
11
+ # +From+:: phone number, e.g. 7325551234
12
+ # +Status+:: ringing, in-progress, queued, busy, no-answer, or failed
13
+ # +StartTime+:: date in the following format: YYYY-MM-DD
14
+ # +Page+:: integer greater than 0
15
+ # +PageSize+:: integer greater than 0
16
+ def list(optional_params = {})
17
+ response = Network.get(['Calls'], optional_params)
18
+ ResourceCollection.new(response, 'calls', self)
19
+ end
20
+
21
+ # Returns a Telapi::Call object given its id
22
+ # See http://www.telapi.com/docs/api/rest/calls/view/
23
+ def get(id)
24
+ response = Network.get(['Calls', id])
25
+ Call.new(response)
26
+ end
27
+
28
+ # Creates a call, returning a Telapi::Call object
29
+ # See http://www.telapi.com/docs/api/rest/calls/make/
30
+ #
31
+ # Required params:
32
+ # +to+:: phone number, e.g. 7325551234
33
+ # +from+:: phone number, e.g. 7325551234
34
+ # +url+:: valid url
35
+ #
36
+ # Optional params is a hash containing:
37
+ # +ForwardedFrom+:: phone number, e.g. 7325551234
38
+ # +Method+:: (POST) or GET
39
+ # +FallbackUrl+:: valid URL
40
+ # +FallbackMethod+:: (POST) or GET
41
+ # +StatusCallback+:: valid URL
42
+ # +StatusCallbackMethod+:: (POST) or GET
43
+ # +SendDigits+:: 0-9, #, or *
44
+ # +Timeout+:: integer greater than or equal to 0 (default: 60)
45
+ # +HideCallerId+:: true or (false)
46
+ def make(to, from, url, optional_params = {})
47
+ opts = { :To => to, :From => from, :Url => url }.merge(optional_params)
48
+ response = Network.post(['Calls'], opts)
49
+ Call.new(response)
50
+ end
51
+
52
+ # Interrupts a call, returning a Telapi::Call object
53
+ # See http://www.telapi.com/docs/api/rest/calls/interrupt/
54
+ #
55
+ # Required params:
56
+ # +id+:: call id
57
+ # +url+:: valid url
58
+ # +method+:: (POST) or GET
59
+ # +status+:: canceled or (completed)
60
+ def interrupt(id, url, method = 'POST', status = 'completed')
61
+ opts = { :Url => url, :Method => method, :Status => status }
62
+ response = Network.post(['Calls', id], opts)
63
+ Call.new(response)
64
+ end
65
+
66
+ # Hangs up a call, returning a Telapi::Call object
67
+ # See http://www.telapi.com/docs/api/rest/calls/hangup/
68
+ #
69
+ # Required params:
70
+ # +id+:: call id
71
+ # +status+:: completed
72
+ def hangup(id, status = 'completed')
73
+ opts = { :Status => status }
74
+ response = Network.post(['Calls', id], opts)
75
+ Call.new(response)
76
+ end
77
+
78
+ # Sends touch tones during call, returning a Telapi::Call object
79
+ # See http://www.telapi.com/docs/api/rest/calls/send-digits/
80
+ #
81
+ # Required params:
82
+ # +id+:: call id
83
+ # +play_dtmf+:: 0-9, W, or w
84
+ # +play_dtmf_leg+:: aleg or bleg
85
+ def send_digits(id, play_dtmf, play_dtmf_leg = 'aleg')
86
+ opts = { :PlayDtmf => play_dtmf, :PlayDtmfLeg => play_dtmf_leg }
87
+ response = Network.post(['Calls', id], opts)
88
+ Call.new(response)
89
+ end
90
+
91
+ # Play audio file during call, returning a Telapi::Call object
92
+ # See http://www.telapi.com/docs/api/rest/calls/play-audio/
93
+ #
94
+ # Required params:
95
+ # +id+:: call id
96
+ # +sound_url+:: valid URL
97
+ #
98
+ # Optional params is a hash containing:
99
+ # +Length+:: integer greater than or equal to 0
100
+ # +Legs+:: aleg, bleg, or (both)
101
+ # +Loop+:: true or (false)
102
+ # +Mix+:: true or (false)
103
+ def play_audio(id, sound_url, optional_params = {})
104
+ opts = { :Sounds => sound_url }.merge(optional_params)
105
+ response = Network.post(['Calls', id, 'Play'], opts)
106
+ Call.new(response)
107
+ end
108
+
109
+ # Change caller's voice via speed and pitch of audio, returning a Telapi::Call object
110
+ # See http://www.telapi.com/docs/api/rest/calls/voice-effects/
111
+ #
112
+ # Required params:
113
+ # +id+:: call id
114
+ #
115
+ # Optional params is a hash containing:
116
+ # +AudioDirection+:: in or (out)
117
+ # +Pitch+:: value between -1 and 1, including 0
118
+ # +PitchSemiTones+:: value between -14 and 14, including 0
119
+ # +PitchOctaves+:: value between -1 and 1, including 0
120
+ # +Rate+:: value between -1 and 1, including 0
121
+ def voice_effect(id, optional_params = {})
122
+ response = Network.post(['Calls', id, 'Effect'], optional_params)
123
+ Call.new(response)
124
+ end
125
+
126
+ # Initiate or end a call recording, returning a Telapi::Call object
127
+ # See http://www.telapi.com/docs/api/rest/calls/record/
128
+ #
129
+ # Required params:
130
+ # +id+:: call id
131
+ # +record+:: (true) or false
132
+ #
133
+ # Optional params is a hash containing:
134
+ # +TimeLimit+:: integer greater than or equal to 0
135
+ # +CallbackUrl+:: valid URL
136
+ def record(id, record = true, optional_params = {})
137
+ opts = { :Record => record }.merge(optional_params)
138
+ response = Network.post(['Calls', id, 'Recordings'], opts)
139
+ Call.new(response)
140
+ end
141
+
142
+ # Returns a resource collection containing Telapi::Recording objects
143
+ # See http://www.telapi.com/docs/api/rest/recordings/list/
144
+ #
145
+ # Required params:
146
+ # +id+:: call id
147
+ #
148
+ # Optional params is a hash containing:
149
+ # +DateCreated+:: date in the following format: YYYY-MM-DD
150
+ # +Page+:: integer greater than 0
151
+ # +PageSize+:: integer greater than 0
152
+ def recordings(id, optional_params = {})
153
+ response = Network.get(['Calls', id, 'Recordings'], optional_params)
154
+ ResourceCollection.new(response, 'recordings', Recording)
155
+ end
156
+
157
+ # Returns a resource collection containing Telapi::Notification objects
158
+ # See http://www.telapi.com/docs/api/rest/notifications/list/
159
+ #
160
+ # Required params:
161
+ # +id+:: call id
162
+ #
163
+ # Optional params is a hash containing:
164
+ # +Log+:: 0 (error), 1 (warning), or 2 (info)
165
+ # +Page+:: integer greater than 0
166
+ # +PageSize+:: integer greater than 0
167
+ def notifications(id, optional_params = {})
168
+ response = Network.get(['Calls', id, 'Notifications'], optional_params)
169
+ ResourceCollection.new(response, 'notifications', Notification)
170
+ end
171
+ end
172
+
173
+ # See ::interrupt
174
+ def interrupt(url, method = 'POST', status = 'completed')
175
+ self.class.interrupt(self.sid, url, method, status)
176
+ end
177
+
178
+ # See ::hangup
179
+ def hangup(status = 'completed')
180
+ self.class.hangup(self.sid, status)
181
+ end
182
+
183
+ # See ::send_digits
184
+ def send_digits(play_dtmf, play_dtmf_leg = 'aleg')
185
+ self.class.send_digits(self.sid, play_dtmf, play_dtmf_leg)
186
+ end
187
+
188
+ # See ::play_audio
189
+ def play_audio(sound_url, optional_params = {})
190
+ self.class.play_audio(self.sid, sound_url, optional_params)
191
+ end
192
+
193
+ # See ::voice_effect
194
+ def voice_effect(optional_params = {})
195
+ self.class.voice_effect(self.sid, optional_params)
196
+ end
197
+
198
+ # See ::record
199
+ def record(record = true, optional_params = {})
200
+ self.class.record(self.sid, record, optional_params)
201
+ end
202
+
203
+ # See ::recordings
204
+ def recordings(optional_params = {})
205
+ self.class.recordings(self.sid, optional_params)
206
+ end
207
+
208
+ # See ::notifications
209
+ def notifications(optional_params = {})
210
+ self.class.notifications(self.sid, optional_params)
211
+ end
212
+
213
+ end
214
+ end