lib/marvin/base.rb in jeffrafter-marvin-0.1.20081115 vs lib/marvin/base.rb in jeffrafter-marvin-0.1.20081120
- old
+ new
@@ -31,14 +31,46 @@
else
return rh[self.name][message_name]
end
end
- def on_event(name, &blk)
+ # Registers a block or method to be called when
+ # a given event is occured.
+ # == Examples
+ #
+ # on_event :incoming_message, :process_commands
+ #
+ # Will call process_commands the current object
+ # every time incoming message is called.
+ #
+ # on_event :incoming_message do
+ # Marvin::Logger.debug ">> #{options.inspect}"
+ # end
+ #
+ # Will invoke the block every time an incoming message
+ # is processed.
+ def on_event(name, method_name = nil, &blk)
+ # If the name is set and it responds to :to_sym
+ # and no block was passed in.
+ blk = proc { self.send(method_name.to_sym) } if method_name.respond_to?(:to_sym) && blk.blank?
self.event_handlers_for(name, false) << blk
end
+ def on_numeric(value, method_name = nil, &blk)
+ if value.is_a?(Numeric)
+ new_value = "%03d" % value
+ else
+ new_value = Marvin::IRC::Replies[value]
+ end
+ if new_value.nil?
+ logger.error "The numeric '#{value}' was undefined"
+ else
+ blk = proc { self.send(method_name.to_sym) } if method_name.respond_to?(:to_sym) && blk.blank?
+ self.event_handlers_for(:"incoming_numeric_#{new_value}", false) << blk
+ end
+ end
+
# Register's in the IRC Client callback chain.
def register!(parent = Marvin::Settings.default_client)
return if self == Marvin::Base # Only do it for sub-classes.
parent.register_handler self.new
end
@@ -55,19 +87,25 @@
# Given an incoming message, handle it appropriatly.
def handle(message, options)
begin
self.setup_defaults(options)
h = self.class.event_handlers_for(message)
- h.each do |handle|
- self.instance_eval &handle
- end
+ h.each { |handle| self.instance_eval(&handle) }
rescue Exception => e
logger.fatal "Exception processing handle #{message}"
Marvin::ExceptionTracker.log(e)
end
end
+ def handle_incoming_numeric(opts)
+ self.handle(:incoming_numeric, opts)
+ name = :"incoming_numeric_#{options.code}"
+ events = self.class.event_handlers_for(name)
+ logger.debug "Dispatching #{events.size} events for #{name}"
+ events.each { |eh| self.instance_eval(&eh) }
+ end
+
def say(message, target = self.target)
client.msg target, message
end
def pm(target, message)
@@ -95,14 +133,14 @@
self.target && !from_channel?
end
# Determines whether the previous message was inside a channel.
def from_channel?
- self.target && self.target[0] == ?#
+ self.target && [?#, ?&].include?(self.target[0])
end
def addressed?
- self.from_user? || options.message.split(" ").first.downcase == "#{self.client.nickname.downcase}:"
+ self.from_user? || options.message =~ /^#{self.client.nickname.downcase}:\s+/i
end
def setup_defaults(options)
self.options = options.is_a?(OpenStruct) ? options : OpenStruct.new(options)
self.target = options[:target] if options.has_key?(:target)
\ No newline at end of file