lib/god/contacts/jabber.rb in mojombo-god-0.7.13 vs lib/god/contacts/jabber.rb in mojombo-god-0.7.14
- old
+ new
@@ -17,11 +17,11 @@
module God
module Contacts
class Jabber < Contact
class << self
- attr_accessor :settings, :format
+ attr_accessor :settings, :format, :client
end
self.format = lambda do |message, priority, category, host|
text = "Message: #{message}\n"
text += "Host: #{host}\n" if host
@@ -35,31 +35,93 @@
def valid?
valid = true
end
def notify(message, time, priority, category, host)
+ connect
+
+ body = Jabber.format.call message, priority, category, host
+
+ message = XMPP4R::Message::new self.jabber_id, body
+ message.set_type :normal
+ message.set_id '1'
+ message.set_subject 'God'
+
+ self.send!(message)
+
+ self.info = "sent jabber message to #{self.jabber_id}"
+ rescue => e
+ puts e.message
+ puts e.backtrace.join("\n")
+
+ self.info = "failed to send jabber message to #{self.jabber_id}: #{e.message}"
+ end
+
+ def send!(msg)
+ attempts = 0
begin
- jabber_id = XMPP4R::JID::new "#{Jabber.settings[:jabber_id]}/God"
- jabber_client = XMPP4R::Client::new jabber_id
- jabber_client.connect
- jabber_client.auth Jabber.settings[:password]
+ attempts += 1
+ client.send(msg)
+ rescue Errno::EPIPE, IOError => e
+ sleep 1
+ disconnect!
+ reconnect!
+ retry unless attempts > 3
+ raise e
+ rescue Errno::ECONNRESET => e
+ sleep (attempts^2) * 60 + 60
+ disconnect!
+ reconnect!
+ retry unless attempts > 3
+ raise e
+ end
+ end
+
+ def connect
+ connect! unless connected?
+ end
+
+ def connected?
+ connected = client.respond_to?(:is_connected?) && client.is_connected?
+ return connected
+ end
+
+ def connect!
+ disconnect! if connected?
- body = Jabber.format.call message, priority, category, host
-
- message = XMPP4R::Message::new self.jabber_id, body
- message.set_type :normal
- message.set_id '1'
- message.set_subject 'God'
- jabber_client.send message
-
- self.info = "sent jabber message to #{self.jabber_id}"
- rescue => e
- puts e.message
- puts e.backtrace.join("\n")
-
- self.info = "failed to send jabber message to #{self.jabber_id}: #{e.message}"
+ @connect_mutex ||= Mutex.new
+ # don't try to connect if another thread is already connecting.
+ return if @connect_mutex.locked?
+ @connect_mutex.lock
+
+ jabber_id = XMPP4R::JID::new "#{Jabber.settings[:jabber_id]}/God"
+ jabber_client = XMPP4R::Client::new jabber_id
+ jabber_client.connect Jabber.settings[:host]
+ jabber_client.auth Jabber.settings[:password]
+ self.client = jabber_client
+
+ @connect_mutex.unlock
+ end
+
+ def disconnect!
+ if client.respond_to?(:is_connected?) && client.is_connected?
+ begin
+ client.close
+ rescue Errno::EPIPE, IOError => e
+ self.info "Failed to disconnect: #{e}"
+ nil
+ end
end
+ client = nil
end
+
+ def client
+ Jabber.client
+ end
+
+ def client=(jc)
+ Jabber.client = jc
+ end
+
end
-
end
end
\ No newline at end of file