#
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?
fs.inject(ds) { |mid, f| mid = f.call(mid) }
end
+ # This method returns the global filter name for filter _name_
+ # in group _group_
+ def global_filter_name(name, group=nil)
+ (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 = ( group ? "#{group}.#{name}" : name.to_s ).intern
+ 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
end
end
+ # This method is used to retrieve the filter names (in a given group)
+ def filter_names(group=nil)
+ if group
+ gkey = group.to_sym
+ return [] unless defined? @filter_group and @filter_group.key?(gkey)
+ return @filter_group[gkey].keys
+ else
+ return [] unless defined? @filters
+ return @filters.keys
+ 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 ||= {}