tsig_api 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5502843ccb8a98114e81d8b945e1dc074bbb504b
4
+ data.tar.gz: d88a64b06000bbe3dc81df4ee65509cd6351aaa2
5
+ SHA512:
6
+ metadata.gz: e5af2390f1f4a2bfd636798e7b01d72180f3aab1155dd46f646f6b4511e8bd580cb3f14270a090f887f121377913c1d03e624efa11b2e484f9c5e6b33f50e0e8
7
+ data.tar.gz: 1b307ea2d86adb3b441d2206d633a3b4e9e286f69e59e6b611361edb443eeae5bbaafd85991afa0fe1d4635bd757c73d7c6ce95ccea3a4e8ab27c1fd4036eaac
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 [name of plugin creator]
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,4 @@
1
+ tsig_api
2
+ ========
3
+
4
+ TxtSignal Api Client
@@ -0,0 +1,23 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ desc 'Default: run unit tests.'
6
+ task :default => :test
7
+
8
+ desc 'Test the tsig_api plugin.'
9
+ Rake::TestTask.new(:test) do |t|
10
+ t.libs << 'lib'
11
+ t.libs << 'test'
12
+ t.pattern = 'test/**/*_test.rb'
13
+ t.verbose = true
14
+ end
15
+
16
+ desc 'Generate documentation for the tsig_api plugin.'
17
+ Rake::RDocTask.new(:rdoc) do |rdoc|
18
+ rdoc.rdoc_dir = 'rdoc'
19
+ rdoc.title = 'TSIG API'
20
+ rdoc.options << '--line-numbers' << '--inline-source'
21
+ rdoc.rdoc_files.include('README')
22
+ rdoc.rdoc_files.include('lib/**/*.rb')
23
+ end
data/init.rb ADDED
@@ -0,0 +1,4 @@
1
+ # Include hook code here
2
+ $:.unshift(File.dirname(__FILE__) + '/lib')
3
+
4
+ require 'tsig_api'
@@ -0,0 +1 @@
1
+ # Install hook code here
@@ -0,0 +1,30 @@
1
+
2
+ def build_global_element(elem)
3
+ txtsig_api_config = YAML::load_file(File.join(Rails.root, "config/tsig_api.yml"))
4
+ rails_env = Rails.env.to_s || "development"
5
+ return txtsig_api_config[rails_env.to_sym][elem]
6
+ end
7
+
8
+ module TsigApi
9
+
10
+ # extracts just the text from a tsig flash message
11
+ #
12
+ def self.text_from_flash(str)
13
+ matches = /\<li\>(.+)\<\/li\>/im.match(str)
14
+ messages = []
15
+ if matches
16
+ messages = matches[1].split(/\<\/li\>\s*\<li\>/)
17
+ end
18
+ return messages
19
+ end
20
+
21
+ end
22
+
23
+ require 'rexml/document'
24
+ require 'tsig_api/authorize'
25
+ require 'tsig_api/base'
26
+ require 'tsig_api/carrier'
27
+ require 'tsig_api/contact'
28
+ require 'tsig_api/group'
29
+ require 'tsig_api/message'
30
+ require 'tsig_api/team'
@@ -0,0 +1,15 @@
1
+ require 'tsig_api/base'
2
+
3
+ module TsigApi
4
+
5
+ class Authorize < TsigApi::Base
6
+
7
+ self.remote_type = :authorize
8
+
9
+ def query
10
+ TsigApi::RemoteActions::Request.new(:body => request_xml(:authorize, nil), :url => '/api/authorize')
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,108 @@
1
+ require 'tsig_api/remote_actions'
2
+
3
+ module TsigApi
4
+
5
+ class Base
6
+
7
+ class << self
8
+ attr_accessor :remote_type
9
+
10
+ def establish_connection(clientid, username, password)
11
+ @TXTSIG_CLIENT_ID = clientid
12
+ @TXTSIG_API_USERNAME = username
13
+ @TXTSIG_API_PASSWORD = password
14
+
15
+ TsigApi.send(:const_set, "TXTSIG_HOST", build_global_element(:host)) unless TsigApi.const_defined?(:TXTSIG_HOST)
16
+ TsigApi.send(:const_set, "TXTSIG_PORT", build_global_element(:port)) unless TsigApi.const_defined?(:TXTSIG_PORT)
17
+ end
18
+
19
+ end
20
+
21
+ attr_accessor :group_id
22
+
23
+ def initialize(group_id=nil)
24
+ self.group_id = group_id
25
+ end
26
+
27
+ def list
28
+ raise 'Abstract, subclass'
29
+ end
30
+
31
+ def create
32
+ raise "Abstract, subclass"
33
+ end
34
+
35
+ def query
36
+ raise "Abstract, subclass"
37
+ end
38
+
39
+ def update
40
+ raise "Abstract, subclass"
41
+ end
42
+
43
+ def destroy
44
+ raise "Abstract, subclass"
45
+ end
46
+
47
+ def parse_response(response)
48
+ begin
49
+ doc = REXML::Document.new(response.body)
50
+ rescue
51
+ return nil
52
+ end
53
+ content_type = doc.root.elements[1].attributes["type"]
54
+ response_hash = {}
55
+ doc.root.elements[1].elements[1].elements.each do |e|
56
+ if e.attributes["name"] == self.class.remote_type.to_s.pluralize
57
+ response_hash[e.attributes["name"]] = e.elements.collect do |ne|
58
+ if ne.cdatas.empty?
59
+ ne.get_text.to_s.gsub(/^\s+/, "").gsub(/\s+$/, "")
60
+ else
61
+ ne.cdatas[0].to_s.gsub(/^\s+/, "").gsub(/\s+$/, "")
62
+ end
63
+ end
64
+ else
65
+ if e.cdatas.empty?
66
+ response_hash[e.attributes["name"]] = e.get_text.to_s.gsub(/^\s+/, "").gsub(/\s+$/, "")
67
+ else
68
+ response_hash[e.attributes["name"]] = e.cdatas[0].to_s.gsub(/^\s+/, "").gsub(/\s+$/, "")
69
+ end
70
+ end
71
+ end
72
+ return [content_type, response_hash]
73
+ end
74
+
75
+ protected
76
+
77
+ def credentials_xml
78
+ xml = <<-EOS
79
+ <credentials>
80
+ <api_username><![CDATA[#{TsigApi::Base.instance_variable_get('@TXTSIG_API_USERNAME')}]]></api_username>
81
+ <api_password><![CDATA[#{TsigApi::Base.instance_variable_get('@TXTSIG_API_PASSWORD')}]]></api_password>
82
+ <client_id><![CDATA[#{TsigApi::Base.instance_variable_get('@TXTSIG_CLIENT_ID')}]]></client_id>
83
+ </credentials>
84
+ EOS
85
+ end
86
+
87
+ def group_id_node
88
+ param_node('group', group_id)
89
+ end
90
+
91
+ def param_node(name, value)
92
+ %Q{<param name="#{name}"><![CDATA[#{value}]]></param>}
93
+ end
94
+
95
+ def request_xml(action, body)
96
+ xml = <<-EOS
97
+ <?xml version='1.0'?>
98
+ <txtsig_request version='1.0'>
99
+ #{credentials_xml}
100
+ <action type="#{action.to_s.downcase}_#{self.class.remote_type}">
101
+ #{body}
102
+ </action>
103
+ </txtsig_request>
104
+ EOS
105
+ end
106
+
107
+ end
108
+ end
@@ -0,0 +1,16 @@
1
+ require 'rexml/document'
2
+ require 'tsig_api/base'
3
+
4
+ module TsigApi
5
+
6
+ class Carrier < TsigApi::Base
7
+
8
+ self.remote_type = :carriers
9
+
10
+ def query
11
+ TsigApi::RemoteActions::Request.new(:body => request_xml(:list, "<param name='group'>#{group_id}</param>"))
12
+ end
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,79 @@
1
+ require 'tsig_api/base'
2
+
3
+ module TsigApi
4
+ class Contact < TsigApi::Base
5
+ self.remote_type = :contact
6
+
7
+ def create(options={:first_name => nil, :last_name => nil, :cell_carrier => nil, :cell_number => nil, :receive_messages => nil, :add_teams => nil})
8
+ team_xml = ""
9
+ if options[:add_teams]
10
+ team_xml += "<param name='add_teams'>"
11
+ options[:add_teams].each do |at|
12
+ team_xml += "<team>#{at}</team>"
13
+ end
14
+ team_xml += "</param>"
15
+ end
16
+ remsg = 0
17
+ remsg = 1 if options[:receive_messages]
18
+ xml = "
19
+ <param name='group'>#{group_id}</param>
20
+ <param name='first_name'>#{options[:first_name]}</param>
21
+ <param name='last_name'>#{options[:last_name]}</param>
22
+ <param name='cell_number'>#{options[:cell_number]}</param>
23
+ <param name='cell_carrier'>#{options[:cell_carrier]}</param>
24
+ <param name='receive_messages'>#{remsg}</param>
25
+ #{team_xml}
26
+ "
27
+ TsigApi::RemoteActions::Request.new(:body => request_xml(:create, xml))
28
+ end
29
+
30
+ def query(options={:first_name => nil, :last_name => nil, :cell_carrier => nil, :cell_number => nil, :contact_id => nil})
31
+ xml = "<param name='group'>#{group_id}</param>"
32
+ if options[:contact_id]
33
+ xml += "<param name='contact_id'>#{options[:contact_id]}</param>"
34
+ else
35
+ use_options = options.reject { |o, k| o == :contact_id }
36
+ use_options.each do |arg, val|
37
+ xml += "<param name='#{arg.to_s}'>#{val}</param>" if val
38
+ end
39
+ end
40
+ TsigApi::RemoteActions::Request.new(:body => request_xml(:query, xml))
41
+ end
42
+
43
+ def update(contact_id, options = {:first_name => nil, :last_name => nil, :cell_carrier => nil, :cell_number => nil, :receive_messages => nil, :add_teams => nil, :del_teams => nil})
44
+ xml = "<param name='group'>#{group_id}</param>"
45
+ xml += "<param name='contact_id'>#{contact_id}</param>"
46
+ use_options = options.reject { |o, v| [:add_teams, :del_teams].include?(o) }
47
+ use_options.each do |arg, val|
48
+ xml += "<param name='#{arg.to_s}'>#{val}</param>" if val
49
+ end
50
+ if options[:add_teams]
51
+ add_team_xml = "<param name='add_teams'>"
52
+ options[:add_teams].each do |at|
53
+ add_team_xml += "<team>#{at}</team>"
54
+ end
55
+ add_team_xml += "</param>"
56
+ xml += add_team_xml
57
+ end
58
+ if options[:del_teams]
59
+ del_team_xml = "<param name='del_teams'>"
60
+ options[:del_teams].each do |at|
61
+ del_team_xml += "<team>#{at}</team>"
62
+ end
63
+ del_team_xml += "</param>"
64
+ xml += del_team_xml
65
+ end
66
+ TsigApi::RemoteActions::Request.new(:body => request_xml(:update, xml))
67
+ end
68
+
69
+ def delete(contact_id)
70
+ xml = <<-EOS
71
+ <param name='group'>#{group_id}</param>
72
+ <param name='contact_id'>#{contact_id}</param>
73
+ EOS
74
+
75
+ TsigApi::RemoteActions::Request.new(:body => request_xml(:delete, xml))
76
+ end
77
+
78
+ end
79
+ end
@@ -0,0 +1,15 @@
1
+ require 'tsig_api/base'
2
+
3
+ module TsigApi
4
+
5
+ class Group < TsigApi::Base
6
+
7
+ self.remote_type = :groups
8
+
9
+ def query
10
+ TsigApi::RemoteActions::Request.new(:body => request_xml(:list, nil))
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,116 @@
1
+ require 'tsig_api/base'
2
+
3
+ module TsigApi
4
+
5
+ class Message < TsigApi::Base
6
+ self.remote_type = :message
7
+
8
+ def create(options={:broadcast_type => nil, :date_sent => nil, :send_now => nil, :message => nil, :has_contacts => nil, :has_teams => nil})
9
+ date_sent = (options[:date_sent] || options[:send_at])
10
+ date_sent = parse_date(date_sent) if date_sent
11
+ sndnow = %w(1 true).include?(options[:send_now].to_s)
12
+
13
+ xml = <<-EOS
14
+ <param name='group'><![CDATA[#{group_id}]]></param>
15
+ <param name='broadcast_type'>#{options[:broadcast_type]}</param>
16
+ <param name='send_at'>#{date_sent}</param>
17
+ <param name='send_now'>#{sndnow}</param>
18
+ <param name='message'><![CDATA[#{options[:message]}]]></param>
19
+ EOS
20
+
21
+ if options[:has_contacts]
22
+ has_contact_xml = "<param name='has_contacts'>"
23
+ options[:has_contacts].each do |at|
24
+ has_contact_xml += "<contact>#{at}</contact>"
25
+ end
26
+ has_contact_xml += "</param>"
27
+ xml += has_contact_xml
28
+ end
29
+ if options[:has_teams]
30
+ has_team_xml = "<param name='has_teams'>"
31
+ options[:has_teams].each do |at|
32
+ has_team_xml += "<team><![CDATA[#{at}]]></team>"
33
+ end
34
+ has_team_xml += "</param>"
35
+ xml += has_team_xml
36
+ end
37
+ TsigApi::RemoteActions::Request.new(:body => request_xml(:create, xml))
38
+ end
39
+
40
+ def query(options={:broadcast_type => nil, :date_sent => nil, :send_now => nil, :message => nil, :sent_before => nil, :sent_after => nil, :message_id => nil, :message_by_team => nil })
41
+ xml = "<param name='group'>#{group_id}</param>"
42
+ if options[:message_id]
43
+ xml += "<param name='message_id'>#{options[:message_id]}</param>"
44
+ else
45
+ if options[:send_now]
46
+ sndnow = 0
47
+ sndnow = 1 if options[:send_now]
48
+ end
49
+ options[:send_now] = sndnow
50
+ options[:date_sent] = parse_date(options[:date_sent]) if options[:date_sent]
51
+ options[:sent_after] = parse_date(options[:sent_after]) if options[:sent_after]
52
+ options[:sent_before] = parse_date(options[:sent_before]) if options[:sent_before]
53
+ use_options = options.reject { |o, k| o == :message }
54
+ use_options.each do |arg, val|
55
+ xml += "<param name='#{arg.to_s}'>#{val}</param>" if val
56
+ end
57
+ if options[:message]
58
+ xml += "<param name='message'><![CDATA[#{option[:message]}]]></param>"
59
+ end
60
+ end
61
+ TsigApi::RemoteActions::Request.new(:body => request_xml(:query, xml))
62
+ end
63
+
64
+ def update(message_id, options={:broadcast_type => nil, :date_sent => nil, :send_now => nil, :message => nil, :has_contacts => nil, :has_teams => nil})
65
+ xml = "<param name='group'>#{group_id}</param>"
66
+ xml += "<param name='message_id'>#{message_id}</param>"
67
+ sndnow = 0
68
+ sndnow = 1 if options[:send_now]
69
+ options[:send_now] = sndnow
70
+ options[:date_sent] = parse_date(options[:date_sent]) if options[:date_sent]
71
+ [:broadcast_type, :date_sent, :send_now].each do |arg|
72
+ xml += "<param name='#{arg}'>#{options[arg]}</param>" if options[arg]
73
+ end
74
+ xml += "<param name='message'><![CDATA[#{options[:message]}]]></param>" if options[:message]
75
+ if options[:has_contacts]
76
+ has_contact_xml = "<param name='has_contacts'>"
77
+ options[:has_contacts].each do |at|
78
+ has_contact_xml += "<contact>#{at}</contact>"
79
+ end
80
+ has_contact_xml += "</param>"
81
+ xml += has_contact_xml
82
+ end
83
+ if options[:has_teams]
84
+ has_team_xml = "<param name='has_teams'>"
85
+ options[:has_teams].each do |at|
86
+ has_team_xml += "<team>#{at}</team>"
87
+ end
88
+ has_team_xml += "</param>"
89
+ xml += has_team_xml
90
+ end
91
+ TsigApi::RemoteActions::Request.new(:body => request_xml(:update, xml))
92
+ end
93
+
94
+ def delete(message_id)
95
+ xml = "
96
+ <param name='group'>#{group_id}</param>
97
+ <param name='message_id'>#{message_id}</param>
98
+ "
99
+ TsigApi::RemoteActions::Request.new(:body => request_xml(:delete, xml))
100
+ end
101
+
102
+ private
103
+
104
+ def parse_date(d)
105
+ if not d.is_a?(String)
106
+ begin
107
+ d = d.strftime("%m/%d/%Y %H:%M %p")
108
+ rescue
109
+ raise "Date for message to be sent must be a string in MM-DD-YYYY HH:MM [am/pm] or a DateTime object"
110
+ end
111
+ end
112
+ d
113
+ end
114
+
115
+ end
116
+ end