plivo 0.3.1 → 0.3.4

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 (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