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