Class: DaemonKit::Jabber

Inherits:
Object
  • Object
show all
Defined in:
lib/daemon_kit/jabber.rb

Overview

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

Constant Summary collapse

@@instance =
nil
@@message_handler =
nil
@@presence_handler =
nil
@@subscription_handler =
nil

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Jabber

Returns a new instance of Jabber.

Raises:

  • (ArgumentError)


88
89
90
91
92
93
94
95
96
# File 'lib/daemon_kit/jabber.rb', line 88

def initialize( options = {} )
  @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

Instance Attribute Details

#connectionObject (readonly)

Jabber connection



9
10
11
# File 'lib/daemon_kit/jabber.rb', line 9

def connection
  @connection
end

Class Method Details

.deliver(jid, message) ⇒ Object

Deliver a message to the specified jid.



19
20
21
# File 'lib/daemon_kit/jabber.rb', line 19

def deliver( jid, message )
  instance.connection.deliver( jid, message )
end

.instanceObject

Use this instead of initializing, keeps it singleton



24
25
26
27
28
29
30
31
# File 'lib/daemon_kit/jabber.rb', line 24

def instance
  @instance ||= (
    config = YAML.load_file( "#{DAEMON_ROOT}/config/jabber.yml" )[DAEMON_ENV]
    raise ArgumentError, "Missing Jabber configuration for #{DAEMON_ENV} environment" if config.nil?
    new( config )
  )
  @instance.startup!
end

.presence_updates(&block) ⇒ Object



78
79
80
# File 'lib/daemon_kit/jabber.rb', line 78

def presence_updates(&block)
  @presence_handler = block
end

.process_messagesObject



51
52
53
54
55
# File 'lib/daemon_kit/jabber.rb', line 51

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_subscriptionsObject



68
69
70
71
72
# File 'lib/daemon_kit/jabber.rb', line 68

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_updatesObject



57
58
59
60
61
62
63
64
65
66
# File 'lib/daemon_kit/jabber.rb', line 57

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) ⇒ Object



74
75
76
# File 'lib/daemon_kit/jabber.rb', line 74

def received_messages(&block)
  @message_handler = block
end

.runObject



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/daemon_kit/jabber.rb', line 34

def run
  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) ⇒ Object



82
83
84
# File 'lib/daemon_kit/jabber.rb', line 82

def subscription_requests(&block)
  @subscription_handler = block
end

Instance Method Details

#busy(&block) ⇒ Object



135
136
137
138
139
# File 'lib/daemon_kit/jabber.rb', line 135

def busy(&block)
  self.connection.status(:dnd, "Working...")
  yield
  self.connection.status(:chat, self.status_line )
end

#contactsObject



117
118
119
# File 'lib/daemon_kit/jabber.rb', line 117

def contacts
  @masters + @supporters
end

#shutdown!Object



112
113
114
115
# File 'lib/daemon_kit/jabber.rb', line 112

def shutdown!
  DaemonKit.logger.warn "Disconnecting jabber connection"
  self.connection.disconnect
end

#startup!Object



98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/daemon_kit/jabber.rb', line 98

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_lineObject



141
142
143
# File 'lib/daemon_kit/jabber.rb', line 141

def status_line
  "#{DaemonKit.configuration.daemon_name} ready for instructions"
end

#valid_master?(jid) ⇒ Boolean

Returns:

  • (Boolean)


131
132
133
# File 'lib/daemon_kit/jabber.rb', line 131

def valid_master?( jid )
  @masters.include?( jid.strip.to_s )
end

#valid_messages(&block) ⇒ Object



121
122
123
124
125
126
127
128
129
# File 'lib/daemon_kit/jabber.rb', line 121

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