class Msngr::Messenger
Attributes
A client object interface to receive messages from.
@return [Msngr::Clients::*]
An Array of Receiver objects to dispatch callbacks/messages to.
@return [Array<Receiver>]
Public Class Methods
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
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
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
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
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
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
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