# :title: Stream filters
#
# Author:: Giuseppe "Oblomov" Bilotta <giuseppe.bilotta@gmail.com>
-# Copyright:: (C) 2008 Giuseppe Bilotta
-# License:: GPL v2
#
# This file collects methods to handle 'stream filters', a generic mechanism
# to transform text+attributes into other text+attributes
#
def filter(*args)
@filters ||= {}
- case args.last
- when DataStream
- # the stream is an actual DataStream
- ds = args.pop
- when String
- # the stream is just plain text
- ds = DataStream.new(args.pop)
- when Hash
- # the stream is a Hash, check if the previous element is a String
- if String === args[-2]
- ds = DataStream.new(*args.slice!(-2, 2))
- else
+ if Hash === args.last
+ # the stream is a Hash, check if the previous element is not a Symbol
+ if Symbol === args[-2]
ds = DataStream.new(args.pop)
+ else
+ ds = DataStream.new(*args.slice!(-2, 2))
end
else
- raise "Unknown DataStream class #{args.last.class}"
+ # the stream is just whatever else
+ ds = DataStream.new(args.pop)
end
names = args.dup
return ds if names.empty?
(group ? "#{group}.#{name}" : name.to_s).intern
end
+ # This method checks if the bot has a filter named _name_ (in group
+ # _group_)
+ def has_filter?(name, group=nil)
+ @filters.key?(global_filter_name(name, group))
+ end
+
+ # This method checks if the bot has a filter group named _name_
+ def has_filter_group?(name)
+ @filter_group.key?(name)
+ end
+
# This method is used to register a new filter
def register_filter(name, group=nil, &block)
raise "No block provided" unless block_given?
@filters ||= {}
tlkey = global_filter_name(name, group)
key = name.to_sym
- if @filters.key?(tlkey)
+ if has_filter?(tlkey)
debug "Overwriting filter #{tlkey}"
end
- @filters[tlkey] = DataFilter.new &block
+ @filters[tlkey] = DataFilter.new(&block)
if group
gkey = group.to_sym
@filter_group ||= {}
end
end
+ # This method is used to retrieve the filter group names
+ def filter_groups
+ return [] unless defined? @filter_group
+ return @filter_group.keys
+ end
+
# This method clears the filter list and installs the identity filter
def clear_filters
@filters ||= {}
register_filter(:identity) { |stream| stream }
end
+
+ module Plugins
+ class BotModule
+ # read accessor for the default filter group for this BotModule
+ def filter_group
+ @filter_group ||= name
+ end
+
+ # write accessor for the default filter group for this BotModule
+ def filter_group=(name)
+ @filter_group = name
+ end
+
+ # define a filter defaulting to the default filter group
+ # for this BotModule
+ def define_filter(filter, &block)
+ @bot.register_filter(filter, self.filter_group, &block)
+ end
+
+ # load filters associated with the BotModule by looking in
+ # the path(s) specified by the :path option, defaulting to
+ # * Config::datadir/filters/<name>.rb
+ # * botclass/filters/<name>.rb
+ # (note that as <name> we use #dirname() rather than #name(),
+ # since we're looking for datafiles; this is only relevant
+ # for the very few plugins whose dirname differs from name)
+ def load_filters(options={})
+ case options[:path]
+ when nil
+ us = "#{self.dirname}.rb"
+ paths = [
+ File.join(Config::datadir, 'filters', us),
+ @bot.path('filters', us)
+ ]
+ when Array
+ paths = options[:path]
+ else
+ paths = [options[:path]]
+ end
+
+ paths.each do |file|
+ instance_eval(File.read(file), file) if File.exist?(file)
+ end
+ end
+ end
+ end
+
end
end