]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/alias.rb
fix: TCPSocked.gethostbyname is deprecated
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / alias.rb
index bafd85288cda35e721261e5cd7fea6bfcf5ae07d..67f481dc6c02ff1df275128f054220afb1e1e352 100644 (file)
@@ -36,36 +36,31 @@ class AliasPlugin < Plugin
   class AliasDefinitionError < ArgumentError
   end
 
-  MAX_RECURSION_DEPTH = 10
-
   def initialize
     super
-    @data_path = "#{@bot.botclass}/alias/"
-    @data_file = "#{@data_path}/aliases.yaml"
-    # hash of alias => command entries
-    data = nil
-    aliases = if File.exist?(@data_file) &&
-                 (data = YAML.load_file(@data_file)) &&
-                 data.respond_to?(:each_pair)
-                data
-              else
-                warning _("Data file is not found or corrupt, reinitializing data")
-                Hash.new
-               end
-    @aliases = Hash.new
-    aliases.each_pair do |a, c|
-      begin
-        add_alias(a, c)
-      rescue AliasDefinitionError
-       warning _("Invalid alias entry %{alias} : %{command} in %{filename}: %{reason}") %
-                {:alias => a, :command => c, :filename => @data_file, :reason => $1}
+    @aliases = @registry[:aliases]
+    unless @aliases
+      # attempt to load aliases from data file yaml
+      filename = File.join(datafile, 'aliases.yaml')
+      if File.exists? filename
+        begin
+          @aliases = {}
+          YAML.load_file(filename).each_pair do |a, c|
+            add_alias(a, c)
+          end
+        rescue
+          warning _("Data file is not found or corrupt, reinitializing data")
+          @aliases = {}
+        end
+      else
+        @aliases = {}
       end
-    end 
-  end 
+    end
+  end
 
-  def save 
-    FileUtils.mkdir_p(@data_path)
-    Utils.safe_save(@data_file) {|f| f.write @aliases.to_yaml}
+  def save
+    @registry[:aliases] = @aliases
+    @registry.flush
   end
 
   def cmd_add(m, params)
@@ -112,7 +107,7 @@ class AliasPlugin < Plugin
     command.scan(/<(\w+)>/).flatten.to_set ==
       text.split.grep(/\A[:*](\w+)\Z/) {$1}.to_set or
       raise AliasDefinitionError.new(_('The arguments in alias must match the substitutions in command, and vice versa'))
-    
+
     begin
       map text, :action => :"alias_handle<#{text}>", :auth_path => 'run'
     rescue
@@ -130,25 +125,16 @@ class AliasPlugin < Plugin
     if name.to_s =~ /\Aalias_handle<(.+)>\Z/
       text = $1
       m, params = args
-      # messages created by alias handler will have a depth method, which returns the 
-      # depth of "recursion" caused by the message
-      current_depth = if m.respond_to?(:depth) then m.depth else 0 end
-      if current_depth > MAX_RECURSION_DEPTH
-        m.reply _('The alias seems to have caused infinite recursion. Please examine your alias definitions')
-        return
-      end
 
       command = @aliases[text]
       if command
-        # create a fake message containing the intended command
-        new_msg = PrivMessage.new(@bot, m.server, m.server.user(m.source), m.target,
-                  command.gsub(/<(\w+)>/) {|arg| params[:"#{$1}"].to_s})
-        # tag incremented depth on the message
-        class << new_msg
-          self
-        end.send(:define_method, :depth) {current_depth + 1}
-
-        @bot.plugins.privmsg(new_msg)
+        begin
+          # create a fake message containing the intended command
+          @bot.plugins.privmsg fake_message(command.gsub(/<(\w+)>/) {|arg| params[:"#{$1}"].to_s}, :from => m, :delegate => false)
+        rescue RecurseTooDeep
+          m.reply _('The alias seems to have caused infinite recursion. Please examine your alias definitions')
+          return
+        end
       else
         m.reply(_("Error handling the alias, The alias %{text} is not defined or has beeen removed. I will stop responding to it after rescan,") %
                 {:text => text})