plivo 0.3.1 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +3 -1
  3. data/lib/plivo.rb +665 -661
  4. metadata +29 -22
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fd4f31bca07333c3cf77f6bd7aa1b988de85024b
4
+ data.tar.gz: 53061907e16f4ba4d74f4c2234b847bd350ede43
5
+ SHA512:
6
+ metadata.gz: 752ed143859ba4e7463b3be6feb44d216f95b89cbc29c8516f6ce953990fe1083c545e2b4decf2e54da3dff291d79866234f0518bb099243180a16760bd01241
7
+ data.tar.gz: d5249f4ae0ad9ca35b1572818798c38e2828b0173f3d9d5cd58b31493a5387c37e798e445e5d07eb7d6f81242a4766c893e37e9c633cc93d0df5d5a9bd99ef87
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  Plivo Ruby Library
2
2
  ---------------------------
3
3
 
4
+ [![Gem Version](https://badge.fury.io/rb/plivo.png)](http://badge.fury.io/rb/plivo)
5
+
4
6
  Description
5
7
  ~~~~~~~~~~~
6
8
 
@@ -29,7 +31,7 @@ Requirements
29
31
  ~~~~~~~~~~~~
30
32
  gem "rest-client", "~> 1.6.7"
31
33
  gem "json", "~> 1.6.6"
32
-
34
+ gem "htmlentities", "~> 4.3.1"
33
35
 
34
36
  Usage
35
37
  ~~~~~
data/lib/plivo.rb CHANGED
@@ -2,750 +2,754 @@ require 'rubygems'
2
2
  require 'restclient'
3
3
  require 'json'
4
4
  require 'rexml/document'
5
+ require 'htmlentities'
5
6
 
6
7
  module Plivo
7
8
  class PlivoError < Exception
8
9
  end
9
10
 
10
11
  class RestAPI
11
- attr_accessor :auth_id, :auth_token, :url, :version, :api, :headers, :rest
12
-
13
- def initialize(auth_id, auth_token, url="https://api.plivo.com", version="v1")
14
- @auth_id = auth_id
15
- @auth_token = auth_token
16
- @url = url.chomp('/')
17
- @version = version
18
- @api = @url + '/' + @version + '/Account/' + @auth_id
19
- @headers = {"User-Agent" => "RubyPlivo"}
20
- @rest = RestClient::Resource.new(@api, @auth_id, @auth_token)
21
- end
22
-
23
- def hash_to_params(myhash)
24
- return myhash.map { |k, v| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}" }.join("&")
25
- end
26
-
27
- def request(method, path, params=nil)
28
- if method == "POST"
29
- if not params
30
- params = {}
31
- end
32
- begin
33
- r = @rest[path].post params.to_json, :content_type => 'application/json'
34
- rescue => e
35
- response = e
36
- end
37
- if not response
38
- code = r.code
39
- raw = r.to_str
40
- response = JSON.parse(raw)
41
- end
42
- return [code, response]
43
- elsif method == "GET"
44
- if params
45
- path = path + '?' + hash_to_params(params)
46
- end
47
-
48
- begin
49
- r = @rest[path].get
50
- rescue => e
51
- response = e
52
- end
53
- if not response
54
- code = r.code
55
- raw = r.to_str
56
- response = JSON.parse(raw)
57
- end
58
- return [code, response]
59
- elsif method == "DELETE"
60
- if params
61
- path = path + '?' + hash_to_params(params)
62
- end
63
- begin
64
- r = @rest[path].delete
65
- rescue => e
66
- response = e
67
- end
68
- if not response
69
- code = r.code
70
- end
71
- return [code, ""]
72
- end
73
- return [405, 'Method Not Supported']
74
- end
75
-
76
- ## Accounts ##
77
- def get_account(params={})
78
- return request('GET', "/", params)
79
- end
80
-
81
- def modify_account(params={})
82
- return request('POST', "/", params)
83
- end
84
-
85
- def get_subaccounts(params={})
86
- return request('GET', "/Subaccount/", params)
87
- end
88
-
89
- def create_subaccount(params={})
90
- return request('POST', "/Subaccount/", params)
91
- end
92
-
93
- def get_subaccount(params={})
94
- subauth_id = params.delete("subauth_id")
95
- return request('GET', "/Subaccount/#{subauth_id}/", params)
96
- end
97
-
98
- def modify_subaccount(params={})
99
- subauth_id = params.delete("subauth_id")
100
- return request('POST', "/Subaccount/#{subauth_id}/", params)
101
- end
102
-
103
- def delete_subaccount(params={})
104
- subauth_id = params.delete("subauth_id")
105
- return request('DELETE', "/Subaccount/#{subauth_id}/", params)
106
- end
107
-
108
- ## Applications ##
109
- def get_applications(params={})
110
- return request('GET', "/Application/", params)
111
- end
112
-
113
- def create_application(params={})
114
- return request('POST', "/Application/", params)
115
- end
116
-
117
- def get_application(params={})
118
- app_id = params.delete("app_id")
119
- return request('GET', "/Application/#{app_id}/", params)
120
- end
121
-
122
- def modify_application(params={})
123
- app_id = params.delete("app_id")
124
- return request('POST', "/Application/#{app_id}/", params)
125
- end
126
-
127
- def delete_application(params={})
128
- app_id = params.delete("app_id")
129
- return request('DELETE', "/Application/#{app_id}/", params)
130
- end
131
-
132
- ## Numbers ##
133
- def get_numbers(params={})
134
- return request('GET', "/Number/", params)
135
- end
136
-
137
- def search_numbers(params={})
138
- return request('GET', "/AvailableNumber/", params)
139
- end
140
-
141
- def get_number(params={})
142
- number = params.delete("number")
143
- return request('GET', "/Number/#{number}/", params)
144
- end
145
-
146
- def rent_number(params={})
147
- number = params.delete("number")
148
- return request('POST', "/AvailableNumber/#{number}/", params)
149
- end
150
-
151
- def unrent_number(params={})
152
- number = params.delete("number")
153
- return request('DELETE', "/Number/#{number}/", params)
154
- end
155
-
156
- def link_application_number(params={})
157
- number = params.delete("number")
158
- return request('POST', "/Number/#{number}/", params)
159
- end
160
-
161
- def unlink_application_number(params={})
162
- number = params.delete("number")
163
- params = {"app_id" => ""}
164
- return request('POST', "/Number/#{number}/", params)
165
- end
166
-
167
- def get_number_group(params={})
168
- return request('GET', "/AvailableNumberGroup/", params)
169
- end
170
-
171
- def get_number_group_details(params={})
172
- group_id = params.delete('group_id')
173
- return request('GET', "/AvailableNumberGroup/#{group_id}/", params)
174
- end
175
-
176
- def rent_from_number_group(params={})
177
- group_id = params.delete('group_id')
178
- return request('POST', "/AvailableNumberGroup/#{group_id}/", params)
179
- end
180
-
181
- ## Calls ##
182
- def get_cdrs(params={})
183
- return request('GET', "/Call/", params)
184
- end
185
-
186
- def get_cdr(params={})
187
- record_id = params.delete('record_id')
188
- return request('GET', "/Call/#{record_id}/", params)
189
- end
190
-
191
- def get_live_calls(params={})
192
- params["status"] = "live"
193
- return request('GET', "/Call/", params)
194
- end
195
-
196
- def get_live_call(params={})
197
- call_uuid = params.delete('call_uuid')
198
- params["status"] = "live"
199
- return request('GET', "/Call/#{call_uuid}/", params)
200
- end
201
-
202
- def make_call(params={})
203
- return request('POST', "/Call/", params)
204
- end
205
-
206
- def hangup_all_calls(params={})
207
- return request('DELETE', "/Call/", params)
208
- end
209
-
210
- def transfer_call(params={})
211
- call_uuid = params.delete('call_uuid')
212
- return request('POST', "/Call/#{call_uuid}/", params)
213
- end
214
-
215
- def hangup_call(params={})
216
- call_uuid = params.delete('call_uuid')
217
- return request('DELETE', "/Call/#{call_uuid}/", params)
218
- end
219
-
220
- def record(params={})
221
- call_uuid = params.delete('call_uuid')
222
- return request('POST', "/Call/#{call_uuid}/Record/", params)
223
- end
224
-
225
- def stop_record(params={})
226
- call_uuid = params.delete('call_uuid')
227
- return request('DELETE', "/Call/#{call_uuid}/Record/", params)
228
- end
229
-
230
- def play(params={})
231
- call_uuid = params.delete('call_uuid')
232
- return request('POST', "/Call/#{call_uuid}/Play/", params)
233
- end
234
-
235
- def stop_play(params={})
236
- call_uuid = params.delete('call_uuid')
237
- return request('DELETE', "/Call/#{call_uuid}/Play/", params)
238
- end
239
-
240
- def speak(params={})
241
- call_uuid = params.delete('call_uuid')
242
- return request('POST', "/Call/#{call_uuid}/Speak/", params)
243
- end
244
-
245
- def send_digits(params={})
246
- call_uuid = params.delete('call_uuid')
247
- return request('POST', "/Call/#{call_uuid}/DTMF/", params)
248
- end
249
-
250
- ## Calls requests ##
251
- def hangup_request(params={})
252
- request_uuid = params.delete('request_uuid')
253
- return request('DELETE', "/Request/#{request_uuid}/", params)
254
- end
255
-
256
- ## Conferences ##
257
- def get_live_conferences(params={})
258
- return request('GET', "/Conference/", params)
259
- end
260
-
261
- def hangup_all_conferences(params={})
262
- return request('DELETE', "/Conference/", params)
263
- end
264
-
265
- def get_live_conference(params={})
266
- conference_name = params.delete('conference_name')
267
- return request('GET', "/Conference/#{conference_name}/", params)
268
- end
269
-
270
- def hangup_conference(params={})
271
- conference_name = params.delete('conference_name')
272
- return request('DELETE', "/Conference/#{conference_name}/", params)
273
- end
274
-
275
- def hangup_member(params={})
276
- conference_name = params.delete('conference_name')
277
- member_id = params.delete('member_id')
278
- return request('DELETE', "/Conference/#{conference_name}/Member/#{member_id}/", params)
279
- end
280
-
281
- def play_member(params={})
282
- conference_name = params.delete('conference_name')
283
- member_id = params.delete('member_id')
284
- return request('POST', "/Conference/#{conference_name}/Member/#{member_id}/Play/", params)
285
- end
286
-
287
- def stop_play_member(params={})
288
- conference_name = params.delete('conference_name')
289
- member_id = params.delete('member_id')
290
- return request('DELETE', "/Conference/#{conference_name}/Member/#{member_id}/Play/", params)
291
- end
292
-
293
- def speak_member(params={})
294
- conference_name = params.delete('conference_name')
295
- member_id = params.delete('member_id')
296
- return request('POST', "/Conference/#{conference_name}/Member/#{member_id}/Speak/", params)
297
- end
298
-
299
- def deaf_member(params={})
300
- conference_name = params.delete('conference_name')
301
- member_id = params.delete('member_id')
302
- return request('POST', "/Conference/#{conference_name}/Member/#{member_id}/Deaf/", params)
303
- end
304
-
305
- def undeaf_member(params={})
306
- conference_name = params.delete('conference_name')
307
- member_id = params.delete('member_id')
308
- return request('DELETE', "/Conference/#{conference_name}/Member/#{member_id}/Deaf/", params)
309
- end
310
-
311
- def mute_member(params={})
312
- conference_name = params.delete('conference_name')
313
- member_id = params.delete('member_id')
314
- return request('POST', "/Conference/#{conference_name}/Member/#{member_id}/Mute/", params)
315
- end
316
-
317
- def unmute_member(params={})
318
- conference_name = params.delete('conference_name')
319
- member_id = params.delete('member_id')
320
- return request('DELETE', "/Conference/#{conference_name}/Member/#{member_id}/Mute/", params)
321
- end
322
-
323
- def kick_member(params={})
324
- conference_name = params.delete('conference_name')
325
- member_id = params.delete('member_id')
326
- return request('POST', "/Conference/#{conference_name}/Member/#{member_id}/Kick/", params)
327
- end
328
-
329
- def record_conference(params={})
330
- conference_name = params.delete('conference_name')
331
- return request('POST', "/Conference/#{conference_name}/Record/", params)
332
- end
333
-
334
- def stop_record_conference(params={})
335
- conference_name = params.delete('conference_name')
336
- return request('DELETE', "/Conference/#{conference_name}/Record/", params)
337
- end
338
-
339
- ## Recordings ##
340
- def get_recordings(params={})
341
- return request('GET', "/Recording/", params)
342
- end
343
-
344
- def get_recording(params={})
345
- recording_id = params.delete('recording_id')
346
- return request('GET', "/Recording/#{recording_id}/", params)
347
- end
348
-
349
- ## Endpoints ##
350
- def get_endpoints(params={})
351
- return request('GET', "/Endpoint/", params)
352
- end
353
-
354
- def create_endpoint(params={})
355
- return request('POST', "/Endpoint/", params)
356
- end
357
-
358
- def get_endpoint(params={})
359
- endpoint_id = params.delete('endpoint_id')
360
- return request('GET', "/Endpoint/#{endpoint_id}/", params)
361
- end
362
-
363
- def modify_endpoint(params={})
364
- endpoint_id = params.delete('endpoint_id')
365
- return request('POST', "/Endpoint/#{endpoint_id}/", params)
366
- end
367
-
368
- def delete_endpoint(params={})
369
- endpoint_id = params.delete('endpoint_id')
370
- return request('DELETE', "/Endpoint/#{endpoint_id}/", params)
371
- end
372
-
373
- ## Incoming Carriers ##
374
- def get_incoming_carriers(params={})
375
- return request('GET', "/IncomingCarrier/", params)
376
- end
377
-
378
- def create_incoming_carrier(params={})
379
- return request('POST', "/IncomingCarrier/", params)
380
- end
381
-
382
- def get_incoming_carrier(params={})
383
- carrier_id = params.delete('carrier_id')
384
- return request('GET', "/IncomingCarrier/#{carrier_id}/", params)
385
- end
386
-
387
- def modify_incoming_carrier(params={})
388
- carrier_id = params.delete('carrier_id')
389
- return request('POST', "/IncomingCarrier/#{carrier_id}/", params)
390
- end
391
-
392
- def delete_incoming_carrier(params={})
393
- carrier_id = params.delete('carrier_id')
394
- return request('DELETE', "/IncomingCarrier/#{carrier_id}/", params)
395
- end
396
-
397
- ## Outgoing Carriers ##
398
- def get_outgoing_carriers(params={})
399
- return request('GET', "/OutgoingCarrier/", params)
400
- end
401
-
402
- def create_outgoing_carrier(params={})
403
- return request('POST', "/OutgoingCarrier/", params)
404
- end
405
-
406
- def get_outgoing_carrier(params={})
407
- carrier_id = params.delete('carrier_id')
408
- return request('GET', "/OutgoingCarrier/#{carrier_id}/", params)
409
- end
410
-
411
- def modify_outgoing_carrier(params={})
412
- carrier_id = params.delete('carrier_id')
413
- return request('POST', "/OutgoingCarrier/#{carrier_id}/", params)
414
- end
415
-
416
- def delete_outgoing_carrier(params={})
417
- carrier_id = params.delete('carrier_id')
418
- return request('DELETE', "/OutgoingCarrier/#{carrier_id}/", params)
419
- end
420
-
421
- ## Outgoing Carrier Routings ##
422
- def get_outgoing_carrier_routings(params={})
423
- return request('GET', "/OutgoingCarrierRouting/", params)
424
- end
425
-
426
- def create_outgoing_carrier_routing(params={})
427
- return request('POST', "/OutgoingCarrierRouting/", params)
428
- end
429
-
430
- def get_outgoing_carrier_routing(params={})
431
- routing_id = params.delete('routing_id')
432
- return request('GET', "/OutgoingCarrierRouting/#{routing_id}/", params)
433
- end
434
-
435
- def modify_outgoing_carrier_routing(params={})
436
- routing_id = params.delete('routing_id')
437
- return request('POST', "/OutgoingCarrierRouting/#{routing_id}/", params)
438
- end
439
-
440
- def delete_outgoing_carrier_routing(params={})
441
- routing_id = params.delete('routing_id')
442
- return request('DELETE', "/OutgoingCarrierRouting/#{routing_id}/", params)
443
- end
444
-
445
- ## Pricing ##
446
- def pricing(params={})
447
- return request('GET', "/Pricing/", params)
448
- end
449
-
450
- ## Outgoing Carrier ##
451
-
452
- ## To be added here ##
453
-
454
- ## Message ##
455
- def send_message(params={})
456
- return request('POST', "/Message/", params)
457
- end
458
-
459
- def get_messages(params={})
460
- return request('POST', "/Message/", params)
461
- end
462
-
463
- def get_message(params={})
464
- record_id = params.delete('record_id')
465
- return request('POST', "/Message/#{record_id}/", params)
466
- end
12
+ attr_accessor :auth_id, :auth_token, :url, :version, :api, :headers, :rest
13
+
14
+ def initialize(auth_id, auth_token, url="https://api.plivo.com", version="v1")
15
+ @auth_id = auth_id
16
+ @auth_token = auth_token
17
+ @url = url.chomp('/')
18
+ @version = version
19
+ @api = @url + '/' + @version + '/Account/' + @auth_id
20
+ @headers = {"User-Agent" => "RubyPlivo"}
21
+ @rest = RestClient::Resource.new(@api, @auth_id, @auth_token)
22
+ end
23
+
24
+ def hash_to_params(myhash)
25
+ return myhash.map { |k, v| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}" }.join("&")
26
+ end
27
+
28
+ def request(method, path, params=nil)
29
+ coder = HTMLEntities.new(:html4)
30
+ params.each{ |key,value| value.replace(coder.encode(value, :decimal)) }
31
+ if method == "POST"
32
+ if not params
33
+ params = {}
34
+ end
35
+ begin
36
+ r = @rest[path].post params.to_json, :content_type => 'application/json'
37
+ rescue => e
38
+ response = e
39
+ end
40
+ if not response
41
+ code = r.code
42
+ raw = r.to_str
43
+ response = JSON.parse(raw)
44
+ end
45
+ return [code, response]
46
+ elsif method == "GET"
47
+ if params
48
+ path = path + '?' + hash_to_params(params)
49
+ end
50
+
51
+ begin
52
+ r = @rest[path].get
53
+ rescue => e
54
+ response = e
55
+ end
56
+ if not response
57
+ code = r.code
58
+ raw = r.to_str
59
+ response = JSON.parse(raw)
60
+ end
61
+ return [code, response]
62
+ elsif method == "DELETE"
63
+ if params
64
+ path = path + '?' + hash_to_params(params)
65
+ end
66
+ begin
67
+ r = @rest[path].delete
68
+ rescue => e
69
+ response = e
70
+ end
71
+ if not response
72
+ code = r.code
73
+ end
74
+ return [code, ""]
75
+ end
76
+ return [405, 'Method Not Supported']
77
+ end
78
+
79
+ ## Accounts ##
80
+ def get_account(params={})
81
+ return request('GET', "/", params)
82
+ end
83
+
84
+ def modify_account(params={})
85
+ return request('POST', "/", params)
86
+ end
87
+
88
+ def get_subaccounts(params={})
89
+ return request('GET', "/Subaccount/", params)
90
+ end
91
+
92
+ def create_subaccount(params={})
93
+ return request('POST', "/Subaccount/", params)
94
+ end
95
+
96
+ def get_subaccount(params={})
97
+ subauth_id = params.delete("subauth_id")
98
+ return request('GET', "/Subaccount/#{subauth_id}/", params)
99
+ end
100
+
101
+ def modify_subaccount(params={})
102
+ subauth_id = params.delete("subauth_id")
103
+ return request('POST', "/Subaccount/#{subauth_id}/", params)
104
+ end
105
+
106
+ def delete_subaccount(params={})
107
+ subauth_id = params.delete("subauth_id")
108
+ return request('DELETE', "/Subaccount/#{subauth_id}/", params)
109
+ end
110
+
111
+ ## Applications ##
112
+ def get_applications(params={})
113
+ return request('GET', "/Application/", params)
114
+ end
115
+
116
+ def create_application(params={})
117
+ return request('POST', "/Application/", params)
118
+ end
119
+
120
+ def get_application(params={})
121
+ app_id = params.delete("app_id")
122
+ return request('GET', "/Application/#{app_id}/", params)
123
+ end
124
+
125
+ def modify_application(params={})
126
+ app_id = params.delete("app_id")
127
+ return request('POST', "/Application/#{app_id}/", params)
128
+ end
129
+
130
+ def delete_application(params={})
131
+ app_id = params.delete("app_id")
132
+ return request('DELETE', "/Application/#{app_id}/", params)
133
+ end
134
+
135
+ ## Numbers ##
136
+ def get_numbers(params={})
137
+ return request('GET', "/Number/", params)
138
+ end
139
+
140
+ def search_numbers(params={})
141
+ return request('GET', "/AvailableNumber/", params)
142
+ end
143
+
144
+ def get_number(params={})
145
+ number = params.delete("number")
146
+ return request('GET', "/Number/#{number}/", params)
147
+ end
148
+
149
+ def rent_number(params={})
150
+ number = params.delete("number")
151
+ return request('POST', "/AvailableNumber/#{number}/", params)
152
+ end
153
+
154
+ def unrent_number(params={})
155
+ number = params.delete("number")
156
+ return request('DELETE', "/Number/#{number}/", params)
157
+ end
158
+
159
+ def link_application_number(params={})
160
+ number = params.delete("number")
161
+ return request('POST', "/Number/#{number}/", params)
162
+ end
163
+
164
+ def unlink_application_number(params={})
165
+ number = params.delete("number")
166
+ params = {"app_id" => ""}
167
+ return request('POST', "/Number/#{number}/", params)
168
+ end
169
+
170
+ def get_number_group(params={})
171
+ return request('GET', "/AvailableNumberGroup/", params)
172
+ end
173
+
174
+ def get_number_group_details(params={})
175
+ group_id = params.delete('group_id')
176
+ return request('GET', "/AvailableNumberGroup/#{group_id}/", params)
177
+ end
178
+
179
+ def rent_from_number_group(params={})
180
+ group_id = params.delete('group_id')
181
+ return request('POST', "/AvailableNumberGroup/#{group_id}/", params)
182
+ end
183
+
184
+ ## Calls ##
185
+ def get_cdrs(params={})
186
+ return request('GET', "/Call/", params)
187
+ end
188
+
189
+ def get_cdr(params={})
190
+ record_id = params.delete('record_id')
191
+ return request('GET', "/Call/#{record_id}/", params)
192
+ end
193
+
194
+ def get_live_calls(params={})
195
+ params["status"] = "live"
196
+ return request('GET', "/Call/", params)
197
+ end
198
+
199
+ def get_live_call(params={})
200
+ call_uuid = params.delete('call_uuid')
201
+ params["status"] = "live"
202
+ return request('GET', "/Call/#{call_uuid}/", params)
203
+ end
204
+
205
+ def make_call(params={})
206
+ return request('POST', "/Call/", params)
207
+ end
208
+
209
+ def hangup_all_calls(params={})
210
+ return request('DELETE', "/Call/", params)
211
+ end
212
+
213
+ def transfer_call(params={})
214
+ call_uuid = params.delete('call_uuid')
215
+ return request('POST', "/Call/#{call_uuid}/", params)
216
+ end
217
+
218
+ def hangup_call(params={})
219
+ call_uuid = params.delete('call_uuid')
220
+ return request('DELETE', "/Call/#{call_uuid}/", params)
221
+ end
222
+
223
+ def record(params={})
224
+ call_uuid = params.delete('call_uuid')
225
+ return request('POST', "/Call/#{call_uuid}/Record/", params)
226
+ end
227
+
228
+ def stop_record(params={})
229
+ call_uuid = params.delete('call_uuid')
230
+ return request('DELETE', "/Call/#{call_uuid}/Record/", params)
231
+ end
232
+
233
+ def play(params={})
234
+ call_uuid = params.delete('call_uuid')
235
+ return request('POST', "/Call/#{call_uuid}/Play/", params)
236
+ end
237
+
238
+ def stop_play(params={})
239
+ call_uuid = params.delete('call_uuid')
240
+ return request('DELETE', "/Call/#{call_uuid}/Play/", params)
241
+ end
242
+
243
+ def speak(params={})
244
+ call_uuid = params.delete('call_uuid')
245
+ return request('POST', "/Call/#{call_uuid}/Speak/", params)
246
+ end
247
+
248
+ def send_digits(params={})
249
+ call_uuid = params.delete('call_uuid')
250
+ return request('POST', "/Call/#{call_uuid}/DTMF/", params)
251
+ end
252
+
253
+ ## Calls requests ##
254
+ def hangup_request(params={})
255
+ request_uuid = params.delete('request_uuid')
256
+ return request('DELETE', "/Request/#{request_uuid}/", params)
257
+ end
258
+
259
+ ## Conferences ##
260
+ def get_live_conferences(params={})
261
+ return request('GET', "/Conference/", params)
262
+ end
263
+
264
+ def hangup_all_conferences(params={})
265
+ return request('DELETE', "/Conference/", params)
266
+ end
267
+
268
+ def get_live_conference(params={})
269
+ conference_name = params.delete('conference_name')
270
+ return request('GET', "/Conference/#{conference_name}/", params)
271
+ end
272
+
273
+ def hangup_conference(params={})
274
+ conference_name = params.delete('conference_name')
275
+ return request('DELETE', "/Conference/#{conference_name}/", params)
276
+ end
277
+
278
+ def hangup_member(params={})
279
+ conference_name = params.delete('conference_name')
280
+ member_id = params.delete('member_id')
281
+ return request('DELETE', "/Conference/#{conference_name}/Member/#{member_id}/", params)
282
+ end
283
+
284
+ def play_member(params={})
285
+ conference_name = params.delete('conference_name')
286
+ member_id = params.delete('member_id')
287
+ return request('POST', "/Conference/#{conference_name}/Member/#{member_id}/Play/", params)
288
+ end
289
+
290
+ def stop_play_member(params={})
291
+ conference_name = params.delete('conference_name')
292
+ member_id = params.delete('member_id')
293
+ return request('DELETE', "/Conference/#{conference_name}/Member/#{member_id}/Play/", params)
294
+ end
295
+
296
+ def speak_member(params={})
297
+ conference_name = params.delete('conference_name')
298
+ member_id = params.delete('member_id')
299
+ return request('POST', "/Conference/#{conference_name}/Member/#{member_id}/Speak/", params)
300
+ end
301
+
302
+ def deaf_member(params={})
303
+ conference_name = params.delete('conference_name')
304
+ member_id = params.delete('member_id')
305
+ return request('POST', "/Conference/#{conference_name}/Member/#{member_id}/Deaf/", params)
306
+ end
307
+
308
+ def undeaf_member(params={})
309
+ conference_name = params.delete('conference_name')
310
+ member_id = params.delete('member_id')
311
+ return request('DELETE', "/Conference/#{conference_name}/Member/#{member_id}/Deaf/", params)
312
+ end
313
+
314
+ def mute_member(params={})
315
+ conference_name = params.delete('conference_name')
316
+ member_id = params.delete('member_id')
317
+ return request('POST', "/Conference/#{conference_name}/Member/#{member_id}/Mute/", params)
318
+ end
319
+
320
+ def unmute_member(params={})
321
+ conference_name = params.delete('conference_name')
322
+ member_id = params.delete('member_id')
323
+ return request('DELETE', "/Conference/#{conference_name}/Member/#{member_id}/Mute/", params)
324
+ end
325
+
326
+ def kick_member(params={})
327
+ conference_name = params.delete('conference_name')
328
+ member_id = params.delete('member_id')
329
+ return request('POST', "/Conference/#{conference_name}/Member/#{member_id}/Kick/", params)
330
+ end
331
+
332
+ def record_conference(params={})
333
+ conference_name = params.delete('conference_name')
334
+ return request('POST', "/Conference/#{conference_name}/Record/", params)
335
+ end
336
+
337
+ def stop_record_conference(params={})
338
+ conference_name = params.delete('conference_name')
339
+ return request('DELETE', "/Conference/#{conference_name}/Record/", params)
340
+ end
341
+
342
+ ## Recordings ##
343
+ def get_recordings(params={})
344
+ return request('GET', "/Recording/", params)
345
+ end
346
+
347
+ def get_recording(params={})
348
+ recording_id = params.delete('recording_id')
349
+ return request('GET', "/Recording/#{recording_id}/", params)
350
+ end
351
+
352
+ ## Endpoints ##
353
+ def get_endpoints(params={})
354
+ return request('GET', "/Endpoint/", params)
355
+ end
356
+
357
+ def create_endpoint(params={})
358
+ return request('POST', "/Endpoint/", params)
359
+ end
360
+
361
+ def get_endpoint(params={})
362
+ endpoint_id = params.delete('endpoint_id')
363
+ return request('GET', "/Endpoint/#{endpoint_id}/", params)
364
+ end
365
+
366
+ def modify_endpoint(params={})
367
+ endpoint_id = params.delete('endpoint_id')
368
+ return request('POST', "/Endpoint/#{endpoint_id}/", params)
369
+ end
370
+
371
+ def delete_endpoint(params={})
372
+ endpoint_id = params.delete('endpoint_id')
373
+ return request('DELETE', "/Endpoint/#{endpoint_id}/", params)
374
+ end
375
+
376
+ ## Incoming Carriers ##
377
+ def get_incoming_carriers(params={})
378
+ return request('GET', "/IncomingCarrier/", params)
379
+ end
380
+
381
+ def create_incoming_carrier(params={})
382
+ return request('POST', "/IncomingCarrier/", params)
383
+ end
384
+
385
+ def get_incoming_carrier(params={})
386
+ carrier_id = params.delete('carrier_id')
387
+ return request('GET', "/IncomingCarrier/#{carrier_id}/", params)
388
+ end
389
+
390
+ def modify_incoming_carrier(params={})
391
+ carrier_id = params.delete('carrier_id')
392
+ return request('POST', "/IncomingCarrier/#{carrier_id}/", params)
393
+ end
394
+
395
+ def delete_incoming_carrier(params={})
396
+ carrier_id = params.delete('carrier_id')
397
+ return request('DELETE', "/IncomingCarrier/#{carrier_id}/", params)
398
+ end
399
+
400
+ ## Outgoing Carriers ##
401
+ def get_outgoing_carriers(params={})
402
+ return request('GET', "/OutgoingCarrier/", params)
403
+ end
404
+
405
+ def create_outgoing_carrier(params={})
406
+ return request('POST', "/OutgoingCarrier/", params)
407
+ end
408
+
409
+ def get_outgoing_carrier(params={})
410
+ carrier_id = params.delete('carrier_id')
411
+ return request('GET', "/OutgoingCarrier/#{carrier_id}/", params)
412
+ end
413
+
414
+ def modify_outgoing_carrier(params={})
415
+ carrier_id = params.delete('carrier_id')
416
+ return request('POST', "/OutgoingCarrier/#{carrier_id}/", params)
417
+ end
418
+
419
+ def delete_outgoing_carrier(params={})
420
+ carrier_id = params.delete('carrier_id')
421
+ return request('DELETE', "/OutgoingCarrier/#{carrier_id}/", params)
422
+ end
423
+
424
+ ## Outgoing Carrier Routings ##
425
+ def get_outgoing_carrier_routings(params={})
426
+ return request('GET', "/OutgoingCarrierRouting/", params)
427
+ end
428
+
429
+ def create_outgoing_carrier_routing(params={})
430
+ return request('POST', "/OutgoingCarrierRouting/", params)
431
+ end
432
+
433
+ def get_outgoing_carrier_routing(params={})
434
+ routing_id = params.delete('routing_id')
435
+ return request('GET', "/OutgoingCarrierRouting/#{routing_id}/", params)
436
+ end
437
+
438
+ def modify_outgoing_carrier_routing(params={})
439
+ routing_id = params.delete('routing_id')
440
+ return request('POST', "/OutgoingCarrierRouting/#{routing_id}/", params)
441
+ end
442
+
443
+ def delete_outgoing_carrier_routing(params={})
444
+ routing_id = params.delete('routing_id')
445
+ return request('DELETE', "/OutgoingCarrierRouting/#{routing_id}/", params)
446
+ end
447
+
448
+ ## Pricing ##
449
+ def pricing(params={})
450
+ return request('GET', "/Pricing/", params)
451
+ end
452
+
453
+ ## Outgoing Carrier ##
454
+
455
+ ## To be added here ##
456
+
457
+ ## Message ##
458
+ def send_message(params={})
459
+ return request('POST', "/Message/", params)
460
+ end
461
+
462
+ def get_messages(params={})
463
+ return request('POST', "/Message/", params)
464
+ end
465
+
466
+ def get_message(params={})
467
+ record_id = params.delete('record_id')
468
+ return request('POST', "/Message/#{record_id}/", params)
469
+ end
467
470
  end
468
471
 
469
472
 
470
473
 
471
474
  class Element
472
- class << self
473
- attr_accessor :valid_attributes, :nestables
474
- end
475
- @nestables = []
476
- @valid_attributes = []
477
-
478
- attr_accessor :node, :name
479
-
480
- def initialize(body=nil, attributes={}, &block)
481
- @name = self.class.name.split('::')[1]
482
- @body = body
483
- @node = REXML::Element.new @name
484
- attributes.each do |k, v|
485
- if self.class.valid_attributes.include?(k.to_s)
486
- @node.attributes[k.to_s] = convert_value(v)
487
- else
488
- raise PlivoError, "invalid attribute #{k.to_s} for #{@name}"
489
- end
490
- end
491
- if @body
492
- @node.text = @body
493
- end
494
-
495
- # Allow for nested "nestable" elements using a code block
496
- # ie
497
- # Plivo::Response.new do |r|
498
- # r.Dial do |n|
499
- # n.Number '+15557779999'
500
- # end
501
- # end
502
- yield(self) if block_given?
503
- end
504
-
505
- def method_missing(method, *args, &block)
506
- # Handle the addElement methods
507
- method = $1.to_sym if method.to_s =~ /^add(.*)/
508
- # Add the element
509
- add(Plivo.const_get(method).new(*args, &block))
510
- end
511
-
512
-
513
- def convert_value(v)
514
- if v == true
515
- return "true"
516
- elsif v == false
517
- return "false"
518
- elsif v == nil
519
- return "none"
520
- elsif v == "get"
521
- return "GET"
522
- elsif v == "post"
523
- return "POST"
524
- else
525
- return v
526
- end
527
- end
528
-
529
- def add(element)
530
- if not element
531
- raise PlivoError, "invalid element"
532
- end
533
- if self.class.nestables.include?(element.name)
534
- @node.elements << element.node
535
- return element
536
- else
537
- raise PlivoError, "#{element.name} not nestable in #{@name}"
538
- end
539
- end
540
-
541
- def to_xml
542
- return @node.to_s
543
- end
544
-
545
- def to_s
546
- return @node.to_s
547
- end
475
+ class << self
476
+ attr_accessor :valid_attributes, :nestables
477
+ end
478
+ @nestables = []
479
+ @valid_attributes = []
480
+
481
+ attr_accessor :node, :name
482
+
483
+ def initialize(body=nil, attributes={}, &block)
484
+ @name = self.class.name.split('::')[1]
485
+ @body = body
486
+ @node = REXML::Element.new @name
487
+ attributes.each do |k, v|
488
+ if self.class.valid_attributes.include?(k.to_s)
489
+ @node.attributes[k.to_s] = convert_value(v)
490
+ else
491
+ raise PlivoError, "invalid attribute #{k.to_s} for #{@name}"
492
+ end
493
+ end
494
+ if @body
495
+ coder = HTMLEntities.new(:html4)
496
+ @node.text = coder.encode(@body, :decimal)
497
+ end
498
+
499
+ # Allow for nested "nestable" elements using a code block
500
+ # ie
501
+ # Plivo::Response.new do |r|
502
+ # r.Dial do |n|
503
+ # n.Number '+15557779999'
504
+ # end
505
+ # end
506
+ yield(self) if block_given?
507
+ end
508
+
509
+ def method_missing(method, *args, &block)
510
+ # Handle the addElement methods
511
+ method = $1.to_sym if method.to_s =~ /^add(.*)/
512
+ # Add the element
513
+ add(Plivo.const_get(method).new(*args, &block))
514
+ end
515
+
516
+
517
+ def convert_value(v)
518
+ if v == true
519
+ return "true"
520
+ elsif v == false
521
+ return "false"
522
+ elsif v == nil
523
+ return "none"
524
+ elsif v == "get"
525
+ return "GET"
526
+ elsif v == "post"
527
+ return "POST"
528
+ else
529
+ return v
530
+ end
531
+ end
532
+
533
+ def add(element)
534
+ if not element
535
+ raise PlivoError, "invalid element"
536
+ end
537
+ if self.class.nestables.include?(element.name)
538
+ @node.elements << element.node
539
+ return element
540
+ else
541
+ raise PlivoError, "#{element.name} not nestable in #{@name}"
542
+ end
543
+ end
544
+
545
+ def to_xml
546
+ return @node.to_s
547
+ end
548
+
549
+ def to_s
550
+ return @node.to_s
551
+ end
548
552
  end
549
553
 
550
554
 
551
555
  class Response < Element
552
- @nestables = ['Speak', 'Play', 'GetDigits', 'Record', 'Dial', 'Message',
553
- 'Redirect', 'Wait', 'Hangup', 'PreAnswer', 'Conference', 'DTMF']
554
- @valid_attributes = []
556
+ @nestables = ['Speak', 'Play', 'GetDigits', 'Record', 'Dial', 'Message',
557
+ 'Redirect', 'Wait', 'Hangup', 'PreAnswer', 'Conference', 'DTMF']
558
+ @valid_attributes = []
555
559
 
556
- def initialize()
557
- super(nil, {})
558
- end
560
+ def initialize()
561
+ super(nil, {})
562
+ end
559
563
 
560
- def to_xml()
561
- return '<?xml version="1.0" encoding="utf-8" ?>' + super()
562
- end
564
+ def to_xml()
565
+ return '<?xml version="1.0" encoding="utf-8" ?>' + super()
566
+ end
563
567
 
564
- def to_s()
565
- return '<?xml version="1.0" encoding="utf-8" ?>' + super()
566
- end
568
+ def to_s()
569
+ return '<?xml version="1.0" encoding="utf-8" ?>' + super()
570
+ end
567
571
  end
568
572
 
569
573
 
570
574
  class Speak < Element
571
- @nestables = []
572
- @valid_attributes = ['voice', 'language', 'loop']
573
-
574
- def initialize(body, attributes={})
575
- if not body
576
- raise PlivoError, 'No text set for Speak'
577
- end
578
- super(body, attributes)
575
+ @nestables = []
576
+ @valid_attributes = ['voice', 'language', 'loop']
577
+
578
+ def initialize(body, attributes={})
579
+ if not body
580
+ raise PlivoError, 'No text set for Speak'
579
581
  end
582
+ super(body, attributes)
583
+ end
580
584
  end
581
585
 
582
586
 
583
587
  class Play < Element
584
- @nestables = []
585
- @valid_attributes = ['loop']
586
-
587
- def initialize(body, attributes={})
588
- if not body
589
- raise PlivoError 'No url set for Play'
590
- end
591
- super(body, attributes)
588
+ @nestables = []
589
+ @valid_attributes = ['loop']
590
+
591
+ def initialize(body, attributes={})
592
+ if not body
593
+ raise PlivoError 'No url set for Play'
592
594
  end
595
+ super(body, attributes)
596
+ end
593
597
  end
594
598
 
595
599
 
596
600
  class Wait < Element
597
- @nestables = []
598
- @valid_attributes = ['length', 'silence', 'min_silence']
601
+ @nestables = []
602
+ @valid_attributes = ['length', 'silence', 'min_silence']
599
603
 
600
- def initialize(attributes={})
601
- super(nil, attributes)
602
- end
604
+ def initialize(attributes={})
605
+ super(nil, attributes)
606
+ end
603
607
  end
604
608
 
605
609
 
606
610
  class Redirect < Element
607
- @nestables = []
608
- @valid_attributes = ['method']
609
-
610
- def initialize(body, attributes={})
611
- if not body
612
- raise PlivoError 'No url set for Redirect'
613
- end
614
- super(body, attributes)
611
+ @nestables = []
612
+ @valid_attributes = ['method']
613
+
614
+ def initialize(body, attributes={})
615
+ if not body
616
+ raise PlivoError 'No url set for Redirect'
615
617
  end
618
+ super(body, attributes)
619
+ end
616
620
  end
617
621
 
618
622
 
619
623
  class Hangup < Element
620
- @nestables = []
621
- @valid_attributes = ['schedule', 'reason']
624
+ @nestables = []
625
+ @valid_attributes = ['schedule', 'reason']
622
626
 
623
- def initialize(attributes={})
624
- super(nil, attributes)
625
- end
627
+ def initialize(attributes={})
628
+ super(nil, attributes)
629
+ end
626
630
  end
627
631
 
628
632
 
629
633
  class GetDigits < Element
630
- @nestables = ['Speak', 'Play', 'Wait']
631
- @valid_attributes = ['action', 'method', 'timeout', 'digitTimeout',
632
- 'numDigits', 'retries', 'invalidDigitsSound',
633
- 'validDigits', 'playBeep', 'redirect', "finishOnKey",
634
- 'digitTimeout']
635
-
636
- def initialize(attributes={}, &block)
637
- super(nil, attributes, &block)
638
- end
634
+ @nestables = ['Speak', 'Play', 'Wait']
635
+ @valid_attributes = ['action', 'method', 'timeout', 'digitTimeout',
636
+ 'numDigits', 'retries', 'invalidDigitsSound',
637
+ 'validDigits', 'playBeep', 'redirect', "finishOnKey",
638
+ 'digitTimeout']
639
+
640
+ def initialize(attributes={}, &block)
641
+ super(nil, attributes, &block)
642
+ end
639
643
  end
640
644
 
641
645
 
642
646
  class Number < Element
643
- @nestables = []
644
- @valid_attributes = ['sendDigits', 'sendOnPreanswer']
645
-
646
- def initialize(body, attributes={})
647
- if not body
648
- raise PlivoError, 'No number set for Number'
649
- end
650
- super(body, attributes)
647
+ @nestables = []
648
+ @valid_attributes = ['sendDigits', 'sendOnPreanswer']
649
+
650
+ def initialize(body, attributes={})
651
+ if not body
652
+ raise PlivoError, 'No number set for Number'
651
653
  end
654
+ super(body, attributes)
655
+ end
652
656
  end
653
657
 
654
658
 
655
659
  class User < Element
656
- @nestables = []
657
- @valid_attributes = ['sendDigits', 'sendOnPreanswer', 'sipHeaders']
658
-
659
- def initialize(body, attributes={})
660
- if not body
661
- raise PlivoError, 'No user set for User'
662
- end
663
- super(body, attributes)
660
+ @nestables = []
661
+ @valid_attributes = ['sendDigits', 'sendOnPreanswer', 'sipHeaders']
662
+
663
+ def initialize(body, attributes={})
664
+ if not body
665
+ raise PlivoError, 'No user set for User'
664
666
  end
667
+ super(body, attributes)
668
+ end
665
669
  end
666
670
 
667
671
 
668
672
  class Dial < Element
669
- @nestables = ['Number', 'User']
670
- @valid_attributes = ['action','method','timeout','hangupOnStar',
671
- 'timeLimit','callerId', 'callerName', 'confirmSound',
672
- 'dialMusic', 'confirmKey', 'redirect',
673
- 'callbackUrl', 'callbackMethod', 'digitsMatch',
674
- 'sipHeaders']
675
-
676
- def initialize(attributes={}, &block)
677
- super(nil, attributes, &block)
678
- end
673
+ @nestables = ['Number', 'User']
674
+ @valid_attributes = ['action','method','timeout','hangupOnStar',
675
+ 'timeLimit','callerId', 'callerName', 'confirmSound',
676
+ 'dialMusic', 'confirmKey', 'redirect',
677
+ 'callbackUrl', 'callbackMethod', 'digitsMatch',
678
+ 'sipHeaders']
679
+
680
+ def initialize(attributes={}, &block)
681
+ super(nil, attributes, &block)
682
+ end
679
683
  end
680
684
 
681
685
 
682
686
  class Conference < Element
683
- @nestables = []
684
- @valid_attributes = ['muted','beep','startConferenceOnEnter',
685
- 'endConferenceOnExit','waitSound','enterSound', 'exitSound',
686
- 'timeLimit', 'hangupOnStar', 'maxMembers',
687
- 'record', 'recordFileFormat', 'action', 'method', 'redirect',
688
- 'digitsMatch', 'callbackUrl', 'callbackMethod',
689
- 'stayAlone', 'floorEvent',
690
- 'transcriptionType', 'transcriptionUrl',
691
- 'transcriptionMethod']
692
-
693
- def initialize(body, attributes={})
694
- if not body
695
- raise PlivoError, 'No conference name set for Conference'
696
- end
697
- super(body, attributes)
698
- end
687
+ @nestables = []
688
+ @valid_attributes = ['muted','beep','startConferenceOnEnter',
689
+ 'endConferenceOnExit','waitSound','enterSound', 'exitSound',
690
+ 'timeLimit', 'hangupOnStar', 'maxMembers',
691
+ 'record', 'recordFileFormat', 'action', 'method', 'redirect',
692
+ 'digitsMatch', 'callbackUrl', 'callbackMethod',
693
+ 'stayAlone', 'floorEvent',
694
+ 'transcriptionType', 'transcriptionUrl',
695
+ 'transcriptionMethod', 'recordWhenAlone']
696
+
697
+ def initialize(body, attributes={})
698
+ if not body
699
+ raise PlivoError, 'No conference name set for Conference'
700
+ end
701
+ super(body, attributes)
702
+ end
699
703
  end
700
704
 
701
705
 
702
706
  class Record < Element
703
- @nestables = []
704
- @valid_attributes = ['action', 'method', 'timeout','finishOnKey',
705
- 'maxLength', 'playBeep', 'recordSession',
706
- 'startOnDialAnswer', 'redirect', 'fileFormat',
707
- 'callbackUrl', 'callbackMethod',
708
- 'transcriptionType', 'transcriptionUrl',
709
- 'transcriptionMethod']
710
-
711
- def initialize(attributes={})
712
- super(nil, attributes)
713
- end
707
+ @nestables = []
708
+ @valid_attributes = ['action', 'method', 'timeout','finishOnKey',
709
+ 'maxLength', 'playBeep', 'recordSession',
710
+ 'startOnDialAnswer', 'redirect', 'fileFormat',
711
+ 'callbackUrl', 'callbackMethod',
712
+ 'transcriptionType', 'transcriptionUrl',
713
+ 'transcriptionMethod']
714
+
715
+ def initialize(attributes={})
716
+ super(nil, attributes)
717
+ end
714
718
  end
715
719
 
716
720
 
717
721
  class PreAnswer < Element
718
- @nestables = ['Play', 'Speak', 'GetDigits', 'Wait', 'Redirect', 'Message', 'DTMF']
719
- @valid_attributes = []
722
+ @nestables = ['Play', 'Speak', 'GetDigits', 'Wait', 'Redirect', 'Message', 'DTMF']
723
+ @valid_attributes = []
720
724
 
721
- def initialize(attributes={}, &block)
722
- super(nil, attributes, &block)
723
- end
725
+ def initialize(attributes={}, &block)
726
+ super(nil, attributes, &block)
727
+ end
724
728
  end
725
729
 
726
730
 
727
731
  class Message < Element
728
- @nestables = []
729
- @valid_attributes = ['src', 'dst', 'type', 'callbackUrl', 'callbackMethod']
730
-
731
- def initialize(body, attributes={})
732
- if not body
733
- raise PlivoError, 'No text set for Message'
734
- end
735
- super(body, attributes)
732
+ @nestables = []
733
+ @valid_attributes = ['src', 'dst', 'type', 'callbackUrl', 'callbackMethod']
734
+
735
+ def initialize(body, attributes={})
736
+ if not body
737
+ raise PlivoError, 'No text set for Message'
736
738
  end
739
+ super(body, attributes)
740
+ end
737
741
  end
738
742
 
739
743
  class DTMF < Element
740
- @nestables = []
741
- @valid_attributes = []
742
-
743
- def initialize(body, attributes={})
744
- if not body
745
- raise PlivoError, 'No digits set for DTMF'
746
- end
747
- super(body, attributes)
744
+ @nestables = []
745
+ @valid_attributes = []
746
+
747
+ def initialize(body, attributes={})
748
+ if not body
749
+ raise PlivoError, 'No digits set for DTMF'
748
750
  end
751
+ super(body, attributes)
752
+ end
749
753
  end
750
754
 
751
755
  end