Module: Blather::DSL

Defined in:
lib/blather/client/dsl.rb,
lib/blather/client/dsl/pubsub.rb

Overview

# Blather DSL

The DSL is a set of methods that enables you to write cleaner code. Being a module means it can be included in or extend any class you may want to create.

Every stanza handler is registered as a method on the DSL.

Examples:

Include the DSL in the top level namespace.


require 'blather/client'
when_ready { puts "Connected ! send messages to #{jid.stripped}." }

subscription :request? do |s|
  write_to_stream s.approve!
end

message :chat?, :body => 'exit' do |m|
  say m.from, 'Exiting ...'
  shutdown
end

message :chat?, :body do |m|
  say m.from, "You sent: #{m.body}"
end

Set the DSL to its own namespace.


require 'blather/client/dsl'
module Echo
  extend Blather::DSL
  def self.run
    client.run
  end

  when_ready { puts "Connected ! send messages to #{jid.stripped}." }

  subscription :request? do |s|
    write_to_stream s.approve!
  end

  message :chat?, :body => 'exit' do |m|
    say m.from, 'Exiting ...'
    shutdown
  end

  message :chat?, :body do |m|
    say m.from, "You sent: #{m.body}"
  end
end

EM.run { Echo.run }

Create a class out of it


require 'blather/client/dsl'
class Echo
  include Blather::DSL
end

echo = Echo.new
echo.when_ready { puts "Connected ! send messages to #{jid.stripped}." }

echo.subscription :request? do |s|
  write_to_stream s.approve!
end

echo.message :chat?, :body => 'exit' do |m|
  say m.from, 'Exiting ...'
  shutdown
end

echo.message :chat?, :body do |m|
  say m.from, "You sent: #{m.body}"
end

EM.run { echo.client.run }

Defined Under Namespace

Classes: PubSub

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.clientBlather::Client

The actual client connection

Returns:



89
90
91
# File 'lib/blather/client/dsl.rb', line 89

def client
  @client ||= Client.new
end

Instance Method Details

#<<(stanza) ⇒ self

Push data to the stream This works such that it can be chained:

self << stanza1 << stanza2 << "raw data"

Parameters:

  • stanza (#to_xml, #to_s)

    data to send down the wire

Returns:

  • (self)


107
108
109
110
# File 'lib/blather/client/dsl.rb', line 107

def <<(stanza)
  client.write stanza
  self
end

#after(handler = nil, *guards) {|Blather::Stanza| ... } ⇒ Object

Setup an after filter

run after against

Parameters:

  • handler (Symbol) (defaults to: nil)

    (optional) the stanza handler the filter should

  • guards (guards)

    (optional) a set of guards to check the stanza

Yields:



147
148
149
# File 'lib/blather/client/dsl.rb', line 147

def after(handler = nil, *guards, &block)
  client.register_filter :after, handler, *guards, &block
end

#before(handler = nil, *guards) {|Blather::Stanza| ... } ⇒ Object

Setup a before filter

run before against

Parameters:

  • handler (Symbol) (defaults to: nil)

    (optional) the stanza handler the filter should

  • guards (guards)

    (optional) a set of guards to check the stanza

Yields:



136
137
138
# File 'lib/blather/client/dsl.rb', line 136

def before(handler = nil, *guards, &block)
  client.register_filter :before, handler, *guards, &block
end

#disconnected(&block) ⇒ Object

Wrapper for “handle :disconnected”

This is run after the connection has been shut down.

Examples:

Reconnect after a disconnection

disconnected { client.run }


174
175
176
# File 'lib/blather/client/dsl.rb', line 174

def disconnected(&block)
  handle :disconnected, &block
end

#discover(what, who, where, &callback) ⇒ Object

Request items or info from an entity

discover (items|info), [jid], [node] do |response|
end


246
247
248
249
250
251
252
253
# File 'lib/blather/client/dsl.rb', line 246

def discover(what, who, where, &callback)
  stanza = Blather::Stanza.class_from_registration(:query, "http://jabber.org/protocol/disco##{what}").new
  stanza.to = who
  stanza.node = where

  client.register_tmp_handler stanza.id, &callback
  client.write stanza
end

#haltObject

Halt the handler chain

Use this to stop the propogation of the stanza though the handler chain.

Ignore all IQ stanzas

before(:iq) { halt }


224
225
226
# File 'lib/blather/client/dsl.rb', line 224

def halt
  throw :halt
end

#handle(handler, *guards) {|Blather::Stanza| ... } ⇒ Object

Set handler for a stanza type

against

Parameters:

  • handler (Symbol)

    the stanza type it should handle

  • guards (guards)

    (optional) a set of guards to check the stanza

Yields:



157
158
159
# File 'lib/blather/client/dsl.rb', line 157

def handle(handler, *guards, &block)
  client.register_handler handler, *guards, &block
end

#jidBlather::JID

The JID according to the server

Returns:



212
213
214
# File 'lib/blather/client/dsl.rb', line 212

def jid
  client.jid
end

#my_rosterBlather::Roster

Direct access to the roster

Returns:



190
191
192
# File 'lib/blather/client/dsl.rb', line 190

def my_roster
  client.roster
end

#passObject

Pass responsibility to the next handler

Use this to jump out of the current handler and let the next registered handler take care of the stanza

This is contrive and should be handled with guards, but pass a message to the next handler based on the content

message { |s| puts "message caught" }
message { |s| pass if s.body =~ /pass along/ }


239
240
241
# File 'lib/blather/client/dsl.rb', line 239

def pass
  throw :pass
end

#pubsubBlather::PubSub

A pubsub helper

Returns:

  • (Blather::PubSub)


97
98
99
# File 'lib/blather/client/dsl.rb', line 97

def pubsub
  @pubsub ||= PubSub.new client, jid.domain
end

#say(to, msg) ⇒ Object

Helper method to make sending basic messages easier

Parameters:

  • to (Blather::JID, #to_s)

    the JID of the message recipient

  • msg (#to_s)

    the message to send



205
206
207
# File 'lib/blather/client/dsl.rb', line 205

def say(to, msg)
  client.write Blather::Stanza::Message.new(to, msg)
end

#set_status(state = nil, msg = nil) ⇒ Object

Set current status

state

Parameters:

  • state (Blather::Stanza::Presence::State::VALID_STATES) (defaults to: nil)

    the current

  • msg (#to_s) (defaults to: nil)

    the status message to use



183
184
185
# File 'lib/blather/client/dsl.rb', line 183

def set_status(state = nil, msg = nil)
  client.status = state, msg
end

#setup(jid, password, host = nil, port = nil) ⇒ Object

Prepare server settings

this is ‘nil` the domain on the JID will be used

Parameters:

  • jid (#to_s)

    the JID to authenticate with

  • password (#to_s)

    the password to authenticate with

  • host (String) (defaults to: nil)

    (optional) the host to connect to (can be an IP). If

  • (optional) (Fixnum, String)

    port the port to connect on



119
120
121
# File 'lib/blather/client/dsl.rb', line 119

def setup(jid, password, host = nil, port = nil)
  client.setup(jid, password, host, port)
end

#shutdownObject

Shutdown the connection. Flushes the write buffer then stops EventMachine



125
126
127
# File 'lib/blather/client/dsl.rb', line 125

def shutdown
  client.close
end

#when_ready(&block) ⇒ Object

Wrapper for “handle :ready” (just a bit of syntactic sugar)

This is run after the connection has been completely setup



164
165
166
# File 'lib/blather/client/dsl.rb', line 164

def when_ready(&block)
  handle :ready, &block
end

#write_to_stream(stanza) ⇒ Object

Write data to the stream

Parameters:

  • stanza (#to_xml, #to_s)

    the data to send down the wire.



197
198
199
# File 'lib/blather/client/dsl.rb', line 197

def write_to_stream(stanza)
  client.write stanza
end