]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - lib/rbot/message.rb
basics botmodule: use #to_s to stringify multiword parameters
[user/henk/code/ruby/rbot.git] / lib / rbot / message.rb
index fff121944b33f055606565e86d97201ec7abcf80..3292cb8323a1f9aad8c638c25a69059002a40fda 100644 (file)
@@ -4,10 +4,21 @@ module Irc
     :desc => "what non nick-matching prefixes should the bot respond to as if addressed (e.g !, so that '!foo' is treated like 'rbot: foo')"
   )
 
-  Color = "\003"
+  BotConfig.register BotConfigBooleanValue.new('core.reply_with_nick',
+    :default => false, :wizard => true,
+    :desc => "if true, the bot will prepend the nick to what he has to say when replying (e.g. 'markey: you can't do that!')"
+  )
+
+  BotConfig.register BotConfigStringValue.new('core.nick_postfix',
+    :default => ':', :wizard => true,
+    :desc => "when replying with nick put this character after the nick of the user the bot is replying to"
+  )
+
   Bold = "\002"
   Underline = "\037"
   Reverse = "\026"
+  Color = "\003"
+  ColorRx = /#{Color}\d\d?(?:,\d\d?)?/
 
   # base user message class, all user messages derive from this
   # (a user message is defined as having a source hostmask, a target
@@ -54,8 +65,8 @@ module Irc
       @server = server
 
       @identified = false
-      if @msg_wants_id && @server.capabilities["identify-msg".to_sym]
-        if @message =~ /([-+])(.*)/
+      if @msg_wants_id && @server.capabilities[:"identify-msg"]
+        if @message =~ /^([-+])(.*)/
           @identified = ($1=="+")
           @message = $2
         else
@@ -102,7 +113,7 @@ module Irc
     # strip mIRC colour escapes from a string
     def BasicUserMessage.stripcolour(string)
       return "" unless string
-      ret = string.gsub(/\cC\d\d?(?:,\d\d?)?/, "")
+      ret = string.gsub(ColorRx, "")
       #ret.tr!("\x00-\x1f", "")
       ret
     end
@@ -204,25 +215,63 @@ module Irc
     # <tt>@bot.say m.replyto, string</tt>
     # So if the message is private, it will reply to the user. If it was
     # in a channel, it will reply in the channel.
-    def reply(string)
-      @bot.say @replyto, string
+    def plainreply(string, options={})
+      @bot.say @replyto, string, options
       @replied = true
     end
 
+    # Same as reply, but when replying in public it adds the nick of the user
+    # the bot is replying to
+    def nickreply(string, options={})
+      extra = self.public? ? "#{@source}#{@bot.config['core.nick_postfix']} " : ""
+      @bot.say @replyto, extra + string, options
+      @replied = true
+    end
+
+    # the default reply style is to nickreply unless the reply already contains
+    # the nick or core.reply_with_nick is set to false
+    #
+    def reply(string, options={})
+      if @bot.config['core.reply_with_nick'] and not string =~ /\b#{@source}\b/
+        return nickreply(string, options)
+      end
+      plainreply(string, options)
+    end
+
     # convenience method to reply to a message with an action. It's the
     # same as doing:
     # <tt>@bot.action m.replyto, string</tt>
     # So if the message is private, it will reply to the user. If it was
     # in a channel, it will reply in the channel.
-    def act(string)
-      @bot.action @replyto, string
+    def act(string, options={})
+      @bot.action @replyto, string, options
       @replied = true
     end
 
     # convenience method to reply "okay" in the current language to the
     # message
+    def plainokay
+      self.plainreply @bot.lang.get("okay")
+    end
+
+    # Like the above, but append the username
+    def nickokay
+      str = @bot.lang.get("okay").dup
+      if self.public?
+        # remove final punctuation
+        str.gsub!(/[!,.]$/,"")
+        str += ", #{@source}"
+      end
+      self.plainreply str
+    end
+
+    # the default okay style is the same as the default reply style
+    #
     def okay
-      @bot.say @replyto, @bot.lang.get("okay")
+      if @bot.config['core.reply_with_nick']
+        return nickokay
+      end
+      plainokay
     end
 
   end