class DaemonKit::Jabber

Thin wrapper around xmpp4r-simple, specifically designed to ease configuration of a jabber daemon and provide some added simplicity.

Attributes

connection[R]

Jabber connection

Public Class Methods

deliver( jid, message ) click to toggle source

Deliver a message to the specified jid.

# File lib/daemon_kit/jabber.rb, line 19
def deliver( jid, message )
  instance.connection.deliver( jid, message )
end
instance() click to toggle source

Use this instead of initializing, keeps it singleton

# File lib/daemon_kit/jabber.rb, line 24
def instance
  @instance ||= new
  @instance.startup!
end
new() click to toggle source
# File lib/daemon_kit/jabber.rb, line 85
def initialize
  options = DaemonKit::Config.load( 'jabber' )

  @jabber_id  = options.delete("jabber_id")
  @password   = options.delete("password")
  @resource   = options.delete("resource") || 'daemon_kit'
  @masters    = options.delete("masters") || []
  @supporters = options.delete("supporters") || []

  raise ArgumentError if [ @jabber_id, @password ].any? { |a| a.nil? }
end
presence_updates(&block) click to toggle source
# File lib/daemon_kit/jabber.rb, line 75
def presence_updates(&block)
  @presence_handler = block
end
process_messages() click to toggle source
# File lib/daemon_kit/jabber.rb, line 48
def process_messages
  @message_handler ||= Proc.new { |m| DaemonKit.logger.info "Received message from #{m.from}: #{m.body}" }

  instance.valid_messages { |m| @message_handler.call(m) }
end
process_subscriptions() click to toggle source
# File lib/daemon_kit/jabber.rb, line 65
def process_subscriptions
  @subscription_handler ||= Proc.new { |friend,presence| DaemonKit.logger.debug "Received presence update from #{friend}: #{presence}" }

  instance.connection.subscription_requests { |friend,presence| @subscription_handler.call(friend,presence) }
end
process_updates() click to toggle source
# File lib/daemon_kit/jabber.rb, line 54
def process_updates
  @presence_handler ||= Proc.new { |friend, old_presence, new_presence|
    DaemonKit.logger.debug "Received presence update: #{friend} went from #{old_presence} to #{new_presence}"
  }

  instance.connection.presence_updates { |friend, old_presence, new_presence|
    @presence_handler.call(friend, old_presence, new_presence)
  }

end
received_messages(&block) click to toggle source
# File lib/daemon_kit/jabber.rb, line 71
def received_messages(&block)
  @message_handler = block
end
run() click to toggle source
# File lib/daemon_kit/jabber.rb, line 30
def run
  DaemonKit.logger.warn "Please use the new XMPP daemons, this class is deprecated"
  DaemonKit.logger.info "Starting jabber loop"

  loop do
    process_messages
    process_updates
    process_subscriptions

    begin
      sleep 1
    rescue Interrupt
      DaemonKit.logger.warn "Jabber loop interrupted"
      break
    end
  end
end
subscription_requests(&block) click to toggle source
# File lib/daemon_kit/jabber.rb, line 79
def subscription_requests(&block)
  @subscription_handler = block
end

Public Instance Methods

busy() { || ... } click to toggle source
# File lib/daemon_kit/jabber.rb, line 134
def busy(&block)
  self.connection.status(:dnd, "Working...")
  yield
  self.connection.status(:chat, self.status_line )
end
contacts() click to toggle source
# File lib/daemon_kit/jabber.rb, line 116
def contacts
  @masters + @supporters
end
shutdown!() click to toggle source
# File lib/daemon_kit/jabber.rb, line 111
def shutdown!
  DaemonKit.logger.warn "Disconnecting jabber connection"
  self.connection.disconnect
end
startup!() click to toggle source
# File lib/daemon_kit/jabber.rb, line 97
def startup!
  return self if @booted

  connect!
  setup_roster!

  DaemonKit.trap( 'INT', Proc.new { self.shutdown! } )
  DaemonKit.trap( 'TERM', Proc.new { self.shutdown! } )

  @booted = true

  self
end
status_line() click to toggle source
# File lib/daemon_kit/jabber.rb, line 140
def status_line
  "#{DaemonKit.configuration.daemon_name} ready for instructions"
end
valid_master?( jid ) click to toggle source
# File lib/daemon_kit/jabber.rb, line 130
def valid_master?( jid )
  @masters.include?( jid.strip.to_s )
end
valid_messages(&block) click to toggle source
# File lib/daemon_kit/jabber.rb, line 120
def valid_messages(&block)
  self.connection.received_messages.each do |message|
    next unless valid_master?( message.from )

    busy do
      block.call message
    end
  end
end

Private Instance Methods

connect!() click to toggle source
# File lib/daemon_kit/jabber.rb, line 146
def connect!
  jid = @jabber_id + '/' + @resource

  @connection = ::Jabber::Simple.new( jid, @password, nil, self.status_line )
end
setup_roster!() click to toggle source
# File lib/daemon_kit/jabber.rb, line 152
def setup_roster!
  # cleanup the roster
  self.connection.roster.items.each_pair do |jid, roster_item|
    jid = jid.strip.to_s
    unless self.contacts.include?( jid )
      self.connection.remove( jid )
    end
  end

  # add missing contacts
  self.contacts.each do |jid|
    unless self.connection.subscribed_to?( jid )
      self.connection.add( jid )
      #self.connection.accept_subscription( jid )
    end
  end
end