]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - lib/rbot/messagemapper.rb
* autoflush $stdout in setup wizard
[user/henk/code/ruby/rbot.git] / lib / rbot / messagemapper.rb
index 7f13b7fbb78bebaf08c4acef54063af2b7485f4c..b08a503feba4b858790f4f5908d7f9ce0ffde4ff 100644 (file)
@@ -13,11 +13,27 @@ class Regexp
     new = self.source.gsub(/(^|[^\\])((?:\\\\)*)\(([^?])/) {
       "%s%s(?:%s" % [$1, $2, $3]
     }
-    Regexp.new(new)
+    Regexp.new(new, self.options)
+  end
+
+  # We may want to remove head and tail anchors
+  def remove_head_tail
+    new = self.source.sub(/^\^/,'').sub(/\$$/,'')
+    Regexp.new(new, self.options)
+  end
+
+  # The MessageMapper cleanup method: does both remove_capture
+  # and remove_head_tail
+  def mm_cleanup
+    new = self.source.gsub(/(^|[^\\])((?:\\\\)*)\(([^?])/) {
+      "%s%s(?:%s" % [$1, $2, $3]
+    }.sub(/^\^/,'').sub(/\$$/,'')
+    Regexp.new(new, self.options)
   end
 end
 
 module Irc
+class Bot
 
   # MessageMapper is a class designed to reduce the amount of regexps and
   # string parsing plugins and bot modules need to do, in order to process
@@ -192,7 +208,14 @@ module Irc
           if m.bot.auth.allow?(auth, m.source, m.replyto)
             debug "template match found and auth'd: #{action.inspect} #{options.inspect}"
             if tmpl.options[:thread] || tmpl.options[:threaded]
-              Thread.new { @parent.send(action, m, options) }
+              Thread.new do
+                begin
+                  @parent.send(action, m, options)
+                rescue Exception => e
+                  error "In threaded action: #{e.message}"
+                  debug e.backtrace.join("\n")
+                end
+              end
             else
               @parent.send(action, m, options)
             end
@@ -412,6 +435,7 @@ module Irc
           end
           pre = nil if extra.sub!(/^!/, "")
           post = nil if extra.sub!(/!$/, "")
+          extra = nil if extra.empty?
         else
           extra = nil
         end
@@ -475,13 +499,13 @@ module Irc
           sub = is_single ? "\\S+" : ".*?"
         when Regexp
           # Remove captures and the ^ and $ that are sometimes placed in requirement regexps
-          sub = has_req.remove_captures.source.sub(/^\^/,'').sub(/\$$/,'')
+          sub = has_req.mm_cleanup
         when String
           sub = Regexp.escape(has_req)
         when Array
-          sub = has_req[0].remove_captures.source.sub(/^\^/,'').sub(/\$$/,'')
+          sub = has_req[0].mm_cleanup
         when Hash
-          sub = has_req[:regexp].remove_captures.source.sub(/^\^/,'').sub(/\$$/,'')
+          sub = has_req[:regexp].mm_cleanup
         else
           warning "Odd requirement #{has_req.inspect} of class #{has_req.class} for parameter '#{name}'"
           sub = Regexp.escape(has_req.to_s) rescue "\\S+"
@@ -586,3 +610,4 @@ module Irc
     end
   end
 end
+end