local_gateway 0.1

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.
@@ -0,0 +1,111 @@
1
+ require 'rubygems'
2
+ require 'qst_client'
3
+ require 'rest_client'
4
+ require 'uri'
5
+ require 'json'
6
+
7
+ # A local gateway that sends ATs and receives AOs.
8
+ #
9
+ # Usage:
10
+ #
11
+ # # Ask for a ticket.
12
+ # # Returns the welcome message and the newly created local gateway.
13
+ # msg, lgw = LocalGateway.with_automatic_configuration_for do |ticket_number|
14
+ # # Create nuntium channel with ticket number
15
+ # end
16
+ #
17
+ # lgw.send_at 'Hello!', to: '1234'
18
+ #
19
+ # aos = lgw.receive_aos
20
+ class LocalGateway
21
+ attr_reader :address
22
+ attr_reader :url
23
+ attr_reader :user
24
+ attr_reader :password
25
+ attr_reader :protocol
26
+
27
+ # Creates a new local gateway for an existing qst server channel.
28
+ def initialize(url, user, password, address = self.class.default_address, protocol = self.class.default_protocol)
29
+ @address = address
30
+ @url = url
31
+ @user = user
32
+ @password = password
33
+ @protocol = protocol
34
+ @client = QstClient.new(url, user, password)
35
+ return self
36
+ end
37
+
38
+ # Creates a new local gateway that asks for a ticket number, yields it to the block,
39
+ # then polls the ticket status. You must normally create a nuntium channel inside the given block.
40
+ def self.with_automatic_configuration_for(url='http://nuntium.instedd.org/', address = default_address, protocol = default_protocol)
41
+ response = request_configuration_code url, address
42
+ yield response['code']
43
+ data = poll_configuration_status response['code'], response['secret_key'], url
44
+ url = URI::join(url, "/#{data['account']}/qst").to_s
45
+ [data['message'], self.new(url, data['channel'], data['password'])]
46
+ end
47
+
48
+ # Sends an AT message to nuntium.
49
+ #
50
+ # lgw.send_at 'Hello!', to: '1234'
51
+ def send_at(text, options)
52
+ message = {'text' => text, 'to' => options[:to]}
53
+ send_ats message
54
+ end
55
+
56
+ # Recieves AOs from nuntium.
57
+ def receive_aos
58
+ messages = if @last_received_id.nil?
59
+ @client.get_messages
60
+ else
61
+ @client.get_messages :from_id => @last_received_id
62
+ end
63
+ @last_received_id = messages.last['id'] unless messages.empty?
64
+ messages
65
+ end
66
+
67
+ # Sends many AT messages.
68
+ #
69
+ # send_ats [{from: '123', to: '4656', text: 'Hello'}, ...]
70
+ def send_ats(messages)
71
+ messages = [messages] unless messages.kind_of?(Array)
72
+ messages = messages.map do |m|
73
+ message = m.clone
74
+ message['from'] ||= self.address
75
+ message['from'] = with_protocol(message['from'] || message[:from])
76
+ message['to'] = with_protocol(message['to'] || message[:to])
77
+ message
78
+ end
79
+ @client.put_messages(messages)
80
+ end
81
+
82
+
83
+ private
84
+
85
+ def with_protocol(address)
86
+ return nil if address.nil? || address.empty?
87
+ return "#{protocol}://#{address}" unless address.start_with?("#{protocol}://")
88
+ end
89
+
90
+ def self.request_configuration_code(url, address)
91
+ endpoint = URI::join(url, '/tickets.json').to_s
92
+ JSON.parse(RestClient.post(endpoint, :address => address))
93
+ end
94
+
95
+ def self.poll_configuration_status(code, secret_key, url)
96
+ endpoint = URI::join(url, "/tickets/#{code}.json").to_s
97
+ 10.times do
98
+ response = JSON.parse(RestClient.get(endpoint, :params => {:secret_key => secret_key}))
99
+ return response['data'] if response['status'] == 'complete'
100
+ end
101
+ raise "Channel for ticket #{code} does not exist"
102
+ end
103
+
104
+ def self.default_protocol
105
+ 'sms'
106
+ end
107
+
108
+ def self.default_address
109
+ '9990000'
110
+ end
111
+ end
@@ -0,0 +1 @@
1
+ require 'local_gateway'
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: local_gateway
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - InsTEDD
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: qst_client
16
+ requirement: &70138644822120 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70138644822120
25
+ - !ruby/object:Gem::Dependency
26
+ name: builder
27
+ requirement: &70138644821440 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70138644821440
36
+ - !ruby/object:Gem::Dependency
37
+ name: rest-client
38
+ requirement: &70138644820680 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70138644820680
47
+ description: A Local Gateway -developed by InSTEDD- implemented in Ruby for testing
48
+ purposes.
49
+ email: aborenszweig@manas.com.ar
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - lib/local_gateway.rb
55
+ - lib/ruby-local-gateway.rb
56
+ homepage: https://github.com/spalladino/ruby-local-gateway
57
+ licenses: []
58
+ post_install_message:
59
+ rdoc_options: []
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ! '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ requirements: []
75
+ rubyforge_project:
76
+ rubygems_version: 1.8.10
77
+ signing_key:
78
+ specification_version: 3
79
+ summary: A Local Gateway implemented in Ruby
80
+ test_files: []