]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - lib/rbot/core/utils/filters.rb
filters: UI and methods to list filter groups
[user/henk/code/ruby/rbot.git] / lib / rbot / core / utils / filters.rb
index 7535ff420262b088757d3e1dfaebb93bc48ff146..6d560c9150df8d23cd8d4b7f8d068e825cd77e07 100644 (file)
@@ -64,22 +64,16 @@ module ::Irc
     #
     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?
@@ -90,13 +84,30 @@ module ::Irc
       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
@@ -111,6 +122,24 @@ module ::Irc
       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 ||= {}