plivohelper 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/LICENSE +22 -0
  2. data/README.rst +69 -0
  3. data/Rakefile +27 -0
  4. data/lib/plivohelper.rb +604 -0
  5. metadata +58 -0
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2008 Plivo, Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
data/README.rst ADDED
@@ -0,0 +1,69 @@
1
+ Plivo Ruby Helper Library
2
+ ---------------------------
3
+
4
+ Description
5
+ ~~~~~~~~~~~
6
+
7
+ The Plivo Ruby helper simplifies the process of making REST calls and generating RESTXML.
8
+
9
+ See `Plivo Documentation <http://www.plivo.org/docs/>`_ for more information.
10
+
11
+
12
+ Installation
13
+ ~~~~~~~~~~~~~
14
+
15
+ **Gemcutter:**
16
+ $ sudo gem install plivohelper
17
+
18
+
19
+ Manual Installation
20
+ ~~~~~~~~~~~~~~~~~~~~
21
+
22
+ To use the rake command to build the gem and
23
+
24
+ **Download the source and run:**
25
+ $ sudo gem install /path/to/plivohelper/gem
26
+
27
+ to finish the installation
28
+
29
+
30
+ Usage
31
+ ~~~~~
32
+
33
+ To use the Plivo helper library, As shown in example-call.rb,
34
+ you will need to specify the ACCOUNT_ID and ACCOUNT_TOKEN, before you can make REST requests.
35
+
36
+ Before you run the examples, you should have Plivo Running along with FreeSWITCH Running and a user 1000 logged in.
37
+
38
+ See `Plivo Documentation <http://www.plivo.org/docs/>`_ for more information.
39
+
40
+
41
+
42
+ Files
43
+ ~~~~~
44
+
45
+ **lib/plivohelper.rb:** include this library in your code
46
+
47
+ **examples/example-call.rb:** example usage of REST Call
48
+
49
+ **examples/example-bulkcalls.rb:** example usage of REST Bulk Calls
50
+
51
+ **examples/example-transfercall.rb:** example usage of REST Transfer Live Call
52
+
53
+ **examples/example-hangupcall.rb:** example usage of REST Hangup Live Call
54
+
55
+ **examples/example-xml.rb:** example usage of the RESTXML generator
56
+
57
+ **examples/example-utils.rb:** example usage of utilities
58
+
59
+
60
+ Credits
61
+ -------
62
+
63
+ Plivo Ruby Helper Library is derived from `Twilio Ruby Helper <https://github.com/twilio/twilio-ruby>`_
64
+
65
+
66
+ License
67
+ -------
68
+
69
+ The Plivo Ruby Helper Library is distributed under the MIT License
data/Rakefile ADDED
@@ -0,0 +1,27 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+
4
+ spec = Gem::Specification.new do |s|
5
+ s.name = "plivohelper"
6
+ s.version = "0.1"
7
+ s.author = "Team Plivo"
8
+ s.email = "hello@plivo.org"
9
+ s.homepage = "http://www.plivo.org"
10
+ s.description = "A Ruby gem for communicating with the Plivo API and generating RESTXML"
11
+ s.platform = Gem::Platform::RUBY
12
+ s.summary = "A Ruby gem for communicating with the Plivo API and generating RESTXML"
13
+ s.files = FileList["{lib}/*"].to_a
14
+ s.require_path = "lib"
15
+ s.test_files = FileList["{test}/response_spec.rb"].to_a
16
+ s.has_rdoc = true
17
+ s.extra_rdoc_files = ["README.rst"]
18
+ s.add_dependency("builder", ">= 2.1.2")
19
+ end
20
+
21
+ Rake::GemPackageTask.new(spec) do |pkg|
22
+ pkg.need_tar = true
23
+ end
24
+
25
+ task :default => "pkg/#{spec.name}-#{spec.version}.gem" do
26
+ puts "generated latest version"
27
+ end
@@ -0,0 +1,604 @@
1
+
2
+ # @author Plivo
3
+ module Plivo
4
+ require 'net/http'
5
+ require 'net/https'
6
+ require 'uri'
7
+ require 'cgi'
8
+ require 'rubygems'
9
+ require 'builder'
10
+ require 'openssl'
11
+ require 'base64'
12
+
13
+
14
+ # Plivo REST Helpers
15
+ class Rest
16
+
17
+ #@param [String, String] Your Plivo SID/ID and Auth Token
18
+ #@return [Object] Rest object
19
+ def initialize(url, id, token)
20
+ @id = id
21
+ @token = token
22
+ @url = url
23
+ end
24
+
25
+ #sends a request and gets a response from the Plivo REST API
26
+ #
27
+ #@param [String, String, Hash]
28
+ #path, the URL (relative to the endpoint URL, after the /v1
29
+ #method, the HTTP method to use, defaults to POST
30
+ #vars, for POST or PUT, a dict of data to send
31
+ #
32
+ #@return Plivo response XML
33
+ #@raises [ArgumentError] Invalid path parameter
34
+ #@raises [NotImplementedError] Method given is not implemented
35
+ def request(path, method=nil, vars={})
36
+ if !path || path.length < 1
37
+ raise ArgumentError, 'Invalid path parameter'
38
+ end
39
+ if method && !['GET', 'POST'].include?(method)
40
+ raise NotImplementedError, 'HTTP %s not implemented' % method
41
+ end
42
+
43
+ if path[0, 1] == '/'
44
+ uri = @url + path
45
+ else
46
+ uri = @url + '/' + path
47
+ end
48
+
49
+ return fetch(uri, vars, method)
50
+ end
51
+
52
+ # REST Reload Plivo Config Helper
53
+ def reload_config(call_params)
54
+ path = '/v0.1/ReloadConfig/'
55
+ method = 'POST'
56
+ return request(path, method, call_params)
57
+ end
58
+
59
+ # REST Reload Plivo Cache Config Helper
60
+ def reload_cache_config(call_params)
61
+ path = '/v0.1/ReloadCacheConfig/'
62
+ method = 'POST'
63
+ return request(path, method, call_params)
64
+ end
65
+
66
+ # REST Call Helper
67
+ def call(call_params)
68
+ path = '/v0.1/Call/'
69
+ method = 'POST'
70
+ return request(path, method, call_params)
71
+ end
72
+
73
+ # REST Bulk Call Helper
74
+ def bulk_call(call_params)
75
+ path = '/v0.1/BulkCall/'
76
+ method = 'POST'
77
+ return request(path, method, call_params)
78
+ end
79
+
80
+ # REST Group Call Helper
81
+ def group_call(call_params)
82
+ path = '/v0.1/GroupCall/'
83
+ method = 'POST'
84
+ return request(path, method, call_params)
85
+ end
86
+
87
+ # REST Transfer Live Call Helper
88
+ def transfer_call(call_params)
89
+ path = '/v0.1/TransferCall/'
90
+ method = 'POST'
91
+ return request(path, method, call_params)
92
+ end
93
+
94
+ # REST Hangup All Live Calls Helper
95
+ def hangup_all_calls()
96
+ path = '/v0.1/HangupAllCalls/'
97
+ method = 'POST'
98
+ return request(path, method)
99
+ end
100
+
101
+ # REST Hangup Live Call Helper
102
+ def hangup_call(call_params)
103
+ path = '/v0.1/HangupCall/'
104
+ method = 'POST'
105
+ return request(path, method, call_params)
106
+ end
107
+
108
+ # REST Schedule Hangup Helper
109
+ def schedule_hangup(call_params)
110
+ path = '/v0.1/ScheduleHangup/'
111
+ method = 'POST'
112
+ return request(path, method, call_params)
113
+ end
114
+
115
+ # REST Cancel a Scheduled Hangup Helper
116
+ def cancel_scheduled_hangup(call_params)
117
+ path = '/v0.1/CancelScheduledHangup/'
118
+ method = 'POST'
119
+ return request(path, method, call_params)
120
+ end
121
+
122
+ # REST RecordStart helper
123
+ def record_start(call_params)
124
+ path = '/v0.1/RecordStart/'
125
+ method = 'POST'
126
+ return request(path, method, call_params)
127
+ end
128
+
129
+ # REST RecordStop
130
+ def record_stop(call_params)
131
+ path = '/v0.1/RecordStop/'
132
+ method = 'POST'
133
+ return request(path, method, call_params)
134
+ end
135
+
136
+ # REST Play something on a Call Helper
137
+ def play(call_params)
138
+ path = '/v0.1/Play/'
139
+ method = 'POST'
140
+ return request(path, method, call_params)
141
+ end
142
+
143
+ # REST PlayStop on a Call Helper
144
+ def play_stop(call_params)
145
+ path = '/v0.1/PlayStop/'
146
+ method = 'POST'
147
+ return request(path, method, call_params)
148
+ end
149
+
150
+ # REST Schedule Play Helper
151
+ def schedule_play(call_params)
152
+ path = '/v0.1/SchedulePlay/'
153
+ method = 'POST'
154
+ return request(path, method, call_params)
155
+ end
156
+
157
+ # REST Cancel a Scheduled Play Helper
158
+ def cancel_scheduled_play(call_params)
159
+ path = '/v0.1/CancelScheduledPlay/'
160
+ method = 'POST'
161
+ return request(path, method, call_params)
162
+ end
163
+
164
+ # REST Add soundtouch audio effects to a Call Helper
165
+ def sound_touch(call_params)
166
+ path = '/v0.1/SoundTouch/'
167
+ method = 'POST'
168
+ return request(path, method, call_params)
169
+ end
170
+
171
+ # REST Remove soundtouch audio effects on a Call Helper
172
+ def sound_touch_stop(call_params)
173
+ path = '/v0.1/SoundTouchStop/'
174
+ method = 'POST'
175
+ return request(path, method, call_params)
176
+ end
177
+
178
+ # REST Send digits to a Call Helper
179
+ def send_digits(call_params)
180
+ path = '/v0.1/SendDigits/'
181
+ method = 'POST'
182
+ return request(path, method, call_params)
183
+ end
184
+
185
+ # REST Conference Mute helper
186
+ def conference_mute(call_params)
187
+ path = '/v0.1/ConferenceMute/'
188
+ method = 'POST'
189
+ return request(path, method, call_params)
190
+ end
191
+
192
+ # REST Conference Unmute helper
193
+ def conference_unmute(call_params)
194
+ path = '/v0.1/ConferenceUnmute/'
195
+ method = 'POST'
196
+ return request(path, method, call_params)
197
+ end
198
+
199
+ # REST Conference Kick helper
200
+ def conference_kick(call_params)
201
+ path = '/v0.1/ConferenceKick/'
202
+ method = 'POST'
203
+ return request(path, method, call_params)
204
+ end
205
+
206
+ # REST Conference Hangup helper
207
+ def conference_hangup(call_params)
208
+ path = '/v0.1/ConferenceHangup/'
209
+ method = 'POST'
210
+ return request(path, method, call_params)
211
+ end
212
+
213
+ # REST Conference Deaf helper
214
+ def conference_deaf(call_params)
215
+ path = '/v0.1/ConferenceDeaf/'
216
+ method = 'POST'
217
+ return request(path, method, call_params)
218
+ end
219
+
220
+ # REST Conference Undeaf helper
221
+ def conference_undeaf(call_params)
222
+ path = '/v0.1/ConferenceUndeaf/'
223
+ method = 'POST'
224
+ return request(path, method, call_params)
225
+ end
226
+
227
+ # REST Conference RecordStart helper
228
+ def conference_record_start(call_params)
229
+ path = '/v0.1/ConferenceRecordStart/'
230
+ method = 'POST'
231
+ return request(path, method, call_params)
232
+ end
233
+
234
+ # REST Conference RecordStop
235
+ def conference_record_stop(call_params)
236
+ path = '/v0.1/ConferenceRecordStop/'
237
+ method = 'POST'
238
+ return request(path, method, call_params)
239
+ end
240
+
241
+ # REST Conference Play helper
242
+ def conference_play(call_params)
243
+ path = '/v0.1/ConferencePlay/'
244
+ method = 'POST'
245
+ return request(path, method, call_params)
246
+ end
247
+
248
+ # REST Conference Speak helper
249
+ def conference_speak(call_params)
250
+ path = '/v0.1/ConferenceSpeak/'
251
+ method = 'POST'
252
+ return request(path, method, call_params)
253
+ end
254
+
255
+ # REST Conference List Helper
256
+ def conference_list(call_params)
257
+ path = '/v0.1/ConferenceList/'
258
+ method = 'POST'
259
+ return request(path, method, call_params)
260
+ end
261
+
262
+ # REST Conference List Members Helper
263
+ def conference_list_members(call_params)
264
+ path = '/v0.1/ConferenceListMembers/'
265
+ method = 'POST'
266
+ return request(path, method, call_params)
267
+ end
268
+
269
+
270
+ #encode the parameters into a URL friendly string
271
+ #
272
+ #@param [Hash] URL key / values
273
+ #@return [String] Encoded URL
274
+ protected
275
+ def urlencode(params)
276
+ params.to_a.collect! \
277
+ { |k, v| "#{k}=#{CGI.escape(v.to_s)}" }.join("&")
278
+ end
279
+
280
+ # Create the uri for the REST call
281
+ #
282
+ #@param [String, Hash] Base URL and URL parameters
283
+ #@return [String] URI for the REST call
284
+ def build_get_uri(uri, params)
285
+ if params && params.length > 0
286
+ if uri.include?('?')
287
+ if uri[-1, 1] != '&'
288
+ uri += '&'
289
+ end
290
+ uri += urlencode(params)
291
+ else
292
+ uri += '?' + urlencode(params)
293
+ end
294
+ end
295
+ return uri
296
+ end
297
+
298
+ # Returns a http request for the given url and parameters
299
+ #
300
+ #@param [String, Hash, String] Base URL, URL parameters, optional METHOD
301
+ #@return [String] URI for the REST call
302
+ def fetch(url, params, method=nil)
303
+ if method && method == 'GET'
304
+ url = build_get_uri(url, params)
305
+ end
306
+ uri = URI.parse(url)
307
+
308
+ http = Net::HTTP.new(uri.host, uri.port)
309
+ #http.use_ssl = true
310
+
311
+ if method && method == 'GET'
312
+ req = Net::HTTP::Get.new(uri.request_uri)
313
+ elsif method && method == 'DELETE'
314
+ req = Net::HTTP::Delete.new(uri.request_uri)
315
+ elsif method && method == 'PUT'
316
+ req = Net::HTTP::Put.new(uri.request_uri)
317
+ req.set_form_data(params)
318
+ else
319
+ req = Net::HTTP::Post.new(uri.request_uri)
320
+ req.set_form_data(params)
321
+ end
322
+ req.basic_auth(@id, @token)
323
+
324
+ return http.request(req)
325
+ end
326
+ end
327
+
328
+ # RESTXML Response Helpers
329
+ module Element
330
+ module ClassMethods
331
+ @attributes = []
332
+ @allowed_element = []
333
+ attr_accessor :attributes
334
+
335
+ def allowed_element(*element)
336
+ return @allowed_element if element == []
337
+ @allowed_element = [] if @allowed_element.nil?
338
+ element.each do |element_element|
339
+ cleaned_element_element = element_element.to_s.slice(0,1).capitalize + element_element.to_s.slice(1..-1)
340
+ @allowed_element << cleaned_element_element
341
+ end
342
+ @allowed_element = @allowed_element.uniq
343
+ end
344
+
345
+ def attributes(*attrs)
346
+ return @attributes if attrs == []
347
+ @attributes = [] if @attributes.nil?
348
+ @attributes = (@attributes + attrs).uniq
349
+ attr_accessor(*@attributes)
350
+ @attributes
351
+ end
352
+ end
353
+
354
+ def attributes
355
+ self.class.attributes
356
+ end
357
+
358
+ #test if a given element element is allowed to be nested
359
+ #
360
+ #@param [Object] Element to be appended
361
+ #@return [true, false]
362
+ def allowed?(element_element)
363
+ self.class.allowed_element.nil? ? false : self.class.allowed_element.include?(element_element.class.name.split('::')[1])
364
+ end
365
+
366
+ #initialize a plivo response object
367
+ #
368
+ #@param [String, Hash] Body of the element, and a hash of the attributes
369
+ #@return [Object] Plivo element object
370
+ #
371
+ #@raises [ArgumentError] Invalid Argument
372
+ def initialize(body = nil, params = {})
373
+ @children = []
374
+ if body.class == String
375
+ @body = body
376
+ else
377
+ @body = nil
378
+ params = body || {}
379
+ end
380
+ params.each do |k,v|
381
+ if !self.class.attributes.nil? && self.class.attributes.include?(k)
382
+ send(k.to_s+"=",v)
383
+ else
384
+ raise ArgumentError, "Attribute Not Supported"
385
+ end
386
+ end
387
+ end
388
+
389
+ #set an attribute key / value
390
+ #no error checking
391
+ #
392
+ #@param [Hash] Hash of options
393
+ #@return void
394
+ def set(params = {})
395
+ params.each do |k,v|
396
+ self.class.attributes k.to_s
397
+ send(k.to_s+"=",v)
398
+ end
399
+ end
400
+
401
+ #output valid Plivo markup
402
+ #
403
+ #@param [Hash] Hash of options
404
+ #@return [String] Plivo Markup (in XML)
405
+ def respond(opts = {})
406
+ opts[:builder] ||= Builder::XmlMarkup.new(:indent => opts[:indent])
407
+ b = opts[:builder]
408
+ attrs = {}
409
+ attributes.each {|a| attrs[a] = send(a) unless send(a).nil? } unless attributes.nil?
410
+
411
+ if @children and @body.nil?
412
+ b.__send__(self.class.to_s.split(/::/)[-1], attrs) do
413
+ @children.each {|e|e.respond( opts.merge(:skip_instruct => true) )}
414
+ end
415
+ elsif @body and @children == []
416
+ b.__send__(self.class.to_s.split(/::/)[-1], @body, attrs)
417
+ else
418
+ raise ArgumentError, "Cannot have children and a body at the same time"
419
+ end
420
+ end
421
+
422
+ #output valid Plivo markup encoded for inclusion in a URL
423
+ #
424
+ #@param []
425
+ #@return [String] URL encoded Plivo Markup (XML)
426
+ def asURL()
427
+ CGI::escape(self.respond)
428
+ end
429
+
430
+ def append(element_element)
431
+ if(allowed?(element_element))
432
+ @children << element_element
433
+ @children[-1]
434
+ else
435
+ raise ArgumentError, "Element Not Supported"
436
+ end
437
+ end
438
+
439
+ # Element Convenience Methods
440
+ def addSpeak(string_to_speak = nil, opts = {})
441
+ append Plivo::Speak.new(string_to_speak, opts)
442
+ end
443
+
444
+ def addPlay(file_to_play = nil, opts = {})
445
+ append Plivo::Play.new(file_to_play, opts)
446
+ end
447
+
448
+ def addGetDigits(opts = {})
449
+ append Plivo::GetDigits.new(opts)
450
+ end
451
+
452
+ def addGetSpeech(opts = {})
453
+ append Plivo::GetSpeech.new(opts)
454
+ end
455
+
456
+ def addRecord(opts = {})
457
+ append Plivo::Record.new(opts)
458
+ end
459
+
460
+ def addDial(number = nil, opts = {})
461
+ append Plivo::Dial.new(number, opts)
462
+ end
463
+
464
+ def addRedirect(url = nil, opts = {})
465
+ append Plivo::Redirect.new(url, opts)
466
+ end
467
+
468
+ def addSIPTransfer(url = nil, opts = {})
469
+ append Plivo::SIPTransfer.new(url, opts)
470
+ end
471
+
472
+ def addWait(opts = {})
473
+ append Plivo::Wait.new(opts)
474
+ end
475
+
476
+ def addHangup(opts = {})
477
+ append Plivo::Hangup.new(opts)
478
+ end
479
+
480
+ def addNumber(number, opts = {})
481
+ append Plivo::Number.new(number, opts)
482
+ end
483
+
484
+ def addConference(room, opts = {})
485
+ append Plivo::Conference.new(room, opts)
486
+ end
487
+
488
+ def addPreAnswer(opts = {})
489
+ append Plivo::PreAnswer.new(opts)
490
+ end
491
+
492
+ end
493
+
494
+ class Speak
495
+ extend Plivo::Element::ClassMethods
496
+ include Plivo::Element
497
+ attributes :voice, :language, :loop, :engine, :type, :method
498
+ end
499
+
500
+ class Play
501
+ extend Plivo::Element::ClassMethods
502
+ include Plivo::Element
503
+ attributes :loop
504
+ end
505
+
506
+ class GetDigits
507
+ extend Plivo::Element::ClassMethods
508
+ include Plivo::Element
509
+ attributes :action, :method, :timeout, :finishOnKey, :numDigits, :retries, :playBeep, :validDigits, :invalidDigitsSound
510
+ allowed_element :play, :speak, :wait
511
+ end
512
+
513
+ class GetSpeech
514
+ extend Plivo::Element::ClassMethods
515
+ include Plivo::Element
516
+ attributes :action, :method, :timeout, :playBeep, :engine, :grammar, :grammarPath
517
+ allowed_element :play, :speak, :wait
518
+ end
519
+
520
+ class Record
521
+ extend Plivo::Element::ClassMethods
522
+ include Plivo::Element
523
+ attributes :action, :method, :timeout, :finishOnKey, :maxLength, :playBeep, :fileFormat, :fileName, :filePath, :bothLegs, :record
524
+ end
525
+
526
+ class Dial
527
+ extend Plivo::Element::ClassMethods
528
+ include Plivo::Element
529
+ attributes :action, :method, :timeout, :hangupOnStar, :timeLimit, :callerId, :callerName, :confirmSound, :confirmKey, :dialMusic, :redirect, :callbackUrl, :callbackMethod, :digitsMatch
530
+ allowed_element :number
531
+ end
532
+
533
+ class Redirect
534
+ extend Plivo::Element::ClassMethods
535
+ include Plivo::Element
536
+ end
537
+
538
+ class SIPTransfer
539
+ extend Plivo::Element::ClassMethods
540
+ include Plivo::Element
541
+ attributes :method
542
+ end
543
+
544
+ class Wait
545
+ extend Plivo::Element::ClassMethods
546
+ include Plivo::Element
547
+ attributes :length
548
+ end
549
+
550
+ class Hangup
551
+ extend Plivo::Element::ClassMethods
552
+ include Plivo::Element
553
+ attributes :reason, :schedule
554
+ end
555
+
556
+ class Number
557
+ extend Plivo::Element::ClassMethods
558
+ include Plivo::Element
559
+ attributes :sendDigits, :sendOnPreanswer, :gateways, :gatewayCodecs, :gatewayTimeouts, :gatewayRetries, :extraDialString
560
+ end
561
+
562
+ class Conference
563
+ extend Plivo::Element::ClassMethods
564
+ include Plivo::Element
565
+ attributes :muted, :enterSound, :exitSound, :startConferenceOnEnter, :endConferenceOnExit, :waitSound, :timeLimit, :hangupOnStar, :recordFilePath, :recordFileFormat, :recordFileName, :action, :method, :callbackUrl, :callbackMethod, :digitsMatch, :stayAlone, :floorEvent
566
+ end
567
+
568
+ class PreAnswer
569
+ extend Plivo::Element::ClassMethods
570
+ include Plivo::Element
571
+ allowed_element :Speak, :Play, :GetDigits, :Wait, :GetSpeech, :SIPTransfer, :Redirect
572
+ end
573
+
574
+ class Response
575
+ extend Plivo::Element::ClassMethods
576
+ include Plivo::Element
577
+ allowed_element :Speak, :Play, :GetDigits, :Record, :Dial, :Redirect, :Wait, :Hangup, :PreAnswer, :Conference, :GetSpeech, :SIPTransfer
578
+ end
579
+
580
+ # Plivo Utility function and Request Validation class
581
+ class Utils
582
+
583
+ #initialize a plivo utils abject
584
+ #
585
+ #@param [String, String] Your Plivo SID/ID and Auth Token
586
+ #@return [Object] Utils object
587
+ def initialize(id, token)
588
+ @id = id
589
+ @token = token
590
+ end
591
+
592
+ def validateRequest(signature, url, params = {})
593
+ sorted_post_params = params.sort
594
+ data = url
595
+ sorted_post_params.each do |pkey|
596
+ data = data + pkey[0]+pkey[1]
597
+ end
598
+ digest = OpenSSL::Digest::Digest.new('sha1')
599
+ expected = Base64.encode64(OpenSSL::HMAC.digest(digest, @token, data)).strip
600
+ return expected == signature
601
+ end
602
+ end
603
+
604
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: plivohelper
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: "0.1"
6
+ platform: ruby
7
+ authors:
8
+ - Plivo
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2012-01-19 00:00:00 Z
14
+ dependencies: []
15
+
16
+ description: Used to interface with Plivo Telephony Solution from Ruby
17
+ email:
18
+ - support@plivo.com
19
+ executables: []
20
+
21
+ extensions: []
22
+
23
+ extra_rdoc_files: []
24
+
25
+ files:
26
+ - lib/plivohelper.rb
27
+ - LICENSE
28
+ - Rakefile
29
+ - README.rst
30
+ homepage: http://github.com/plivo/plivohelper
31
+ licenses: []
32
+
33
+ post_install_message:
34
+ rdoc_options: []
35
+
36
+ require_paths:
37
+ - lib
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: "0"
50
+ requirements: []
51
+
52
+ rubyforge_project:
53
+ rubygems_version: 1.8.11
54
+ signing_key:
55
+ specification_version: 3
56
+ summary: Plivo Helper Libraries for Ruby
57
+ test_files: []
58
+