class Msngr::Messenger

Attributes

client[R]

A client object interface to receive messages from.

@return [Msngr::Clients::*]

receivers[R]

An Array of Receiver objects to dispatch callbacks/messages to.

@return [Array<Receiver>]

Public Class Methods

new(client) click to toggle source

Initializes a new Messenger.

@param [Msngr::Clients::*] client the to receive messages from.

@return [Receiver]

# File lib/msngr/messenger.rb, line 23
def initialize(client)
  @client = client
  @receivers = []
  @mutex = Mutex.new
end

Public Instance Methods

listen!() click to toggle source

Listens on a new thread. Will auto-restart when crashed in an attempt to recover from exceptions.

# File lib/msngr/messenger.rb, line 55
def listen!
  Thread.new do
    loop do
      begin
        listen
      rescue => e
        puts "Messenger error occurred:"
        puts "#{e.class.name}"
        puts "#{e.backtrace.join("\n")}"
        puts "Restarting.."
        sleep 1
      end
    end
  end
end
subscribe(pattern) click to toggle source

Creates and returns a new Receiver and adds it to @receivers so it'll receive messages matching the provided pattern.

@param [Regexp] pattern

@return [Receiver]

# File lib/msngr/messenger.rb, line 36
def subscribe(pattern)
  Msngr::Receiver.new(pattern).tap do |receiver|
    @mutex.synchronize { @receivers << receiver }
  end
end
unsubscribe(receiver) click to toggle source

Removes the Receiver from @receivers and invokes the receiver's @on_unsubscribe_callbacks.

@param [Receiver] receiver

# File lib/msngr/messenger.rb, line 47
def unsubscribe(receiver)
  @mutex.synchronize { @receivers.delete(receiver) }
  dispatch(receiver.on_unsubscribe_callbacks, self)
end

Private Instance Methods

dispatch(callbacks, *args) click to toggle source

Dispatches args to the provided callbacks.

@param [Array<Proc>] callbacks @param [Array] *args an Array of arguments to call each Proc with.

# File lib/msngr/messenger.rb, line 101
def dispatch(callbacks, *args)
  callbacks.each { |callback| callback.call(*args) }
end
listen() click to toggle source

Instructs the @client to yield events/messages when it receives them. Received events are matched with each Receiver's pattern and will dispatch the event's message to all subscribing Receiver instances that match the event's pattern.

# File lib/msngr/messenger.rb, line 77
def listen
  client.on_message do |event, message|
    subscribing_receivers(event) do |receiver|
      dispatch(receiver.on_message_callbacks, message)
    end
  end
end
subscribing_receivers(event) { |receiver| ... } click to toggle source

Yields Receiver objects who's pattern matches the event.

@param [String] event @yield [Receiver]

# File lib/msngr/messenger.rb, line 90
def subscribing_receivers(event)
  receivers.each do |receiver|
    yield receiver if receiver.pattern.match(event)
  end
end