mack-notifier 0.8.0.101 → 0.8.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.
data/lib/mack-notifier.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  require 'rubygems'
2
2
  require 'validatable'
3
3
  require 'tmail'
4
+ # require 'xmpp4r/client'
5
+ # require 'xmpp4r/roster'
6
+ require 'xmpp4r-simple'
4
7
 
5
8
  fl = File.join(File.dirname(__FILE__), "mack-notifier")
6
9
 
@@ -22,4 +25,4 @@ require File.join(fl, "validations")
22
25
 
23
26
  require File.join(fl, "testing")
24
27
 
25
- require File.join(fl, "loader")
28
+ require File.join(fl, "loader")
@@ -0,0 +1,61 @@
1
+ module Mack
2
+ module Notifier
3
+ module Adapters # :nodoc:
4
+
5
+ class XmppMsgContainer
6
+ attr_accessor :messages
7
+ attr_accessor :recipients
8
+ def initialize
9
+ self.messages = []
10
+ self.recipients = []
11
+ end
12
+
13
+ def find_message_by_recipient(rcpt)
14
+ self.messages.find { |x| x.to.to_s == rcpt.to_s }
15
+ end
16
+
17
+ end
18
+
19
+ # All mail adapters need to extend this class.
20
+ class Xmpp < Mack::Notifier::Adapters::Base
21
+ include Jabber
22
+
23
+ # The transformed (ie, converted, object)
24
+ def transformed
25
+ raise Mack::Errors::UnconvertedNotifier.new if @xmpp_msg.nil?
26
+ return @xmpp_container
27
+ end
28
+
29
+ # Convert the Mack::Notifier object to the adapted object.
30
+ def convert
31
+ settings = configatron.mack.notifier.xmpp_settings
32
+ arr = [mack_notifier.to].flatten
33
+ @xmpp_container = XmppMsgContainer.new
34
+ @xmpp_container.recipients = arr
35
+
36
+ arr.each do |rcpt|
37
+ xmpp_msg = Message::new
38
+ xmpp_msg.set_type(:normal)
39
+ xmpp_msg.set_to(rcpt)
40
+ xmpp_msg.set_from(mack_notifier.from)
41
+ xmpp_msg.set_subject(mack_notifier.subject)
42
+ xmpp_msg.set_type(settings.message_type)
43
+ unless mack_notifier.body(:plain).blank?
44
+ xmpp_msg.set_body(mack_notifier.body(:plain))
45
+ end
46
+
47
+ @xmpp_container.messages << xmpp_msg
48
+ end
49
+
50
+ return @xmpp_container
51
+ end
52
+
53
+ # The RAW encoded String ready for delivery via SMTP, Sendmail, etc...
54
+ def deliverable
55
+ return @xmpp_container
56
+ end
57
+
58
+ end # Base
59
+ end # Adapters
60
+ end # Notifier
61
+ end # Mack
@@ -5,7 +5,7 @@ module Mack
5
5
  module Sendmail
6
6
 
7
7
  def self.deliver(mail)
8
- sendmail_settings = configatron.mack.notifier.sendmail_settings
8
+ sendmail_settings = configatron.mack.notifier.sendmail
9
9
  sendmail_args = sendmail_settings.arguments
10
10
  sendmail_args += " -f \"#{mail.reply_to}\"" if mail.reply_to
11
11
  IO.popen("#{sendmail_settings.location} #{sendmail_args}","w+") do |sm|
@@ -6,7 +6,7 @@ module Mack
6
6
  module Smtp
7
7
 
8
8
  def self.deliver(mail)
9
- smtp_settings = configatron.mack.notifier.smtp_settings
9
+ smtp_settings = configatron.mack.notifier.smtp
10
10
  Net::SMTP.start(smtp_settings.address, smtp_settings.port,
11
11
  smtp_settings.domain, smtp_settings.retrieve(:user_name, nil),
12
12
  smtp_settings.retrieve(:password, nil), smtp_settings.retrieve(:authentication, nil)) do |smtp|
@@ -0,0 +1,78 @@
1
+ module Mack
2
+ module Notifier
3
+ module DeliveryHandlers # :nodoc:
4
+ # Delivers Mack::Notifier objects using XMPP (Jabber)
5
+ module XmppTransport
6
+
7
+ def self.check_availability(client, recipients)
8
+ buddies = {}
9
+ recipients.each do |rcpt|
10
+ buddies[rcpt] = :offline
11
+ end
12
+
13
+ # try to get the presence update
14
+ sleep(1)
15
+ client.presence_updates do |update|
16
+ from = update[0].to_s
17
+ presence = update[1].to_s
18
+ if buddies.has_key?(from)
19
+ buddies[from] = presence
20
+ end
21
+ Mack.logger.info "#{from} --> #{presence}"
22
+ end
23
+ return buddies
24
+ end
25
+
26
+ def self.deliver_message(client, xmpp_msg, wait_for_response, xmpp_errors)
27
+ Mack.logger.info "#{xmpp_msg.to} is online, delivering message"
28
+ client.deliver(xmpp_msg.to, xmpp_msg)
29
+ loop do
30
+ client.received_messages { |ret_msg| @msg_received = true if ret_msg.body == "ack" }
31
+ break if @msg_received or @error
32
+ end if wait_for_response
33
+ return xmpp_errors
34
+ end
35
+
36
+ def self.deliver(xmpp_msg)
37
+ @ex ||= Mack::Errors::XmppError.new("xmpp error")
38
+ xmpp_settings = configatron.mack.notifier.xmpp
39
+ jid_str = xmpp_settings.jid
40
+ jid_str += ("/" + xmpp_settings.jid_resource) if !jid_str.index("/")
41
+ password = xmpp_settings.password
42
+ client = Jabber::Simple.new(jid_str, password)
43
+ thr = Thread.new {
44
+ begin
45
+ xmpp_msg = xmpp_msg.deliverable
46
+ Timeout::timeout(20) do
47
+ buddies = check_availability(client, xmpp_msg.recipients)
48
+
49
+ online_buddies = buddies.keys.reject { |x| buddies[x].to_sym == :offline }
50
+ offline_buddies = buddies.keys.reject { |x| buddies[x].to_sym == :online }
51
+
52
+ if !offline_buddies.empty?
53
+ # there are offline buddies, log the errors
54
+ offline_buddies.each do |buddy|
55
+ err = Mack::Errors::XmppUserNotOnline.new(buddy)
56
+ @ex.add_error(:offline, err)
57
+ end
58
+ end
59
+
60
+ online_buddies.each do |buddy|
61
+ deliver_message(client, xmpp_msg.find_message_by_recipient(buddy), xmpp_settings.wait_for_response, @ex)
62
+ end
63
+
64
+ raise @ex if !@ex.empty?
65
+ end # timeout
66
+ rescue Timeout::Error => ex
67
+ @error = ex
68
+ rescue Exception => ex
69
+ end
70
+ }
71
+
72
+ thr.join
73
+ raise @ex if !@ex.empty?
74
+ end
75
+ end # XmppTransport
76
+ end # DeliveryHandlers
77
+ end # Notifier
78
+ end # Mack
@@ -7,5 +7,49 @@ module Mack
7
7
  end
8
8
  end # UnconvertedNotifier
9
9
 
10
+ class XmppError < StandardError
11
+ def initialize(msg)
12
+ super(msg)
13
+ self.error_hash = {}
14
+ end
15
+
16
+ def add_error(type, msg)
17
+ self.error_hash[type] ||= []
18
+ self.error_hash[type] << msg
19
+ end
20
+
21
+ def get_error(type)
22
+ self.error_hash[type]
23
+ end
24
+
25
+ def empty?
26
+ self.error_hash.empty?
27
+ end
28
+
29
+ attr_accessor :error_hash
30
+ end
31
+
32
+ class XmppAuthenticationError < StandardError
33
+ def initialize(user)
34
+ super("Cannot authenticate: #{user} to xmpp server")
35
+ end
36
+ end
37
+
38
+ class XmppUserNotOnline < StandardError
39
+ def initialize(user)
40
+ super("user #{user} is not online")
41
+ end
42
+ end
43
+
44
+ class XmppSendError < StandardError
45
+ attr_reader :code
46
+ attr_reader :msg
47
+
48
+ def initialize(code, msg)
49
+ super("Cannot send message. Code=#{code}, Msg=#{msg}")
50
+ @code = code
51
+ @msg = msg
52
+ end
53
+ end
10
54
  end # Errors
11
55
  end # Mack
@@ -2,6 +2,8 @@
2
2
  FileUtils.mkdir_p(Mack::Paths.notifiers)
3
3
 
4
4
  # Require all notifiers
5
- Dir.glob(Mack::Paths.notifiers("**/*.rb")).each do |notifier|
6
- require notifier
5
+ Mack.search_path(:app).each do |path|
6
+ Dir.glob(File.join(path, 'notifiers', "**/*.rb")).each do |notifier|
7
+ require File.expand_path(notifier)
8
+ end
7
9
  end
@@ -1,7 +1,16 @@
1
- configatron.mack.notifier.sendmail_settings.set_default(:location, '/usr/sbin/sendmail')
2
- configatron.mack.notifier.sendmail_settings.set_default(:arguments, '-i -t')
3
- configatron.mack.notifier.smtp_settings.set_default(:address, 'localhost')
4
- configatron.mack.notifier.smtp_settings.set_default(:port, 25)
5
- configatron.mack.notifier.smtp_settings.set_default(:domain, 'localhost.localdomain')
1
+ configatron.mack.notifier.sendmail.set_default(:location, '/usr/sbin/sendmail')
2
+ configatron.mack.notifier.sendmail.set_default(:arguments, '-i -t')
3
+ configatron.mack.notifier.smtp.set_default(:address, 'localhost')
4
+ configatron.mack.notifier.smtp.set_default(:port, 25)
5
+ configatron.mack.notifier.smtp.set_default(:domain, 'localhost.localdomain')
6
6
  configatron.mack.notifier.set_default(:deliver_with, (Mack.env == "test" ? "test" : "smtp"))
7
7
  configatron.mack.notifier.set_default(:adapter, 'tmail')
8
+
9
+ # xmpp settings
10
+ configatron.mack.notifier.xmpp.set_default(:jid, 'h_test@jabber80.com')
11
+ configatron.mack.notifier.xmpp.set_default(:jid_resource, 'work')
12
+ configatron.mack.notifier.xmpp.set_default(:password, 'test1234')
13
+ configatron.mack.notifier.xmpp.set_default(:message_type, :chat)
14
+ configatron.mack.notifier.xmpp.set_default(:wait_for_response, true)
15
+ configatron.mack.notifier.xmpp.set_default(:response_wait_time, 20)
16
+ configatron.mack.notifier.xmpp.set_default(:response_message, "ack")
@@ -81,6 +81,10 @@ module Mack
81
81
  return true
82
82
  end
83
83
 
84
+ def errors_for(name)
85
+ self.errors.on(name.to_sym)
86
+ end
87
+
84
88
  end # Validatable
85
89
  end # Notifier
86
90
  end # Mack
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mack-notifier
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0.101
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Bates
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-10-11 00:00:00 -04:00
12
+ date: 2008-10-26 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -32,6 +32,26 @@ dependencies:
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.6.7
34
34
  version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: xmpp4r
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "="
42
+ - !ruby/object:Gem::Version
43
+ version: "0.4"
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: xmpp4r-simple
47
+ type: :runtime
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.8.8
54
+ version:
35
55
  description: Notifier functionality for Mack applications.
36
56
  email: mark@mackframework.com
37
57
  executables: []
@@ -43,10 +63,12 @@ extra_rdoc_files: []
43
63
  files:
44
64
  - lib/mack-notifier/adapters/base.rb
45
65
  - lib/mack-notifier/adapters/tmail.rb
66
+ - lib/mack-notifier/adapters/xmpp_msg.rb
46
67
  - lib/mack-notifier/attachment.rb
47
68
  - lib/mack-notifier/delivery_handlers/sendmail.rb
48
69
  - lib/mack-notifier/delivery_handlers/smtp.rb
49
70
  - lib/mack-notifier/delivery_handlers/test.rb
71
+ - lib/mack-notifier/delivery_handlers/xmpp_transport.rb
50
72
  - lib/mack-notifier/errors.rb
51
73
  - lib/mack-notifier/loader.rb
52
74
  - lib/mack-notifier/notifier.rb