tsig_api 1.0.5

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