X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Fmessage.rb;h=4da511ed8dc944fdec5a1fdec04840c4cf9b6601;hb=8115edef0169d95f0ebb64d77364e346e9452099;hp=901626ec7e6eaf232858c6a3cdbe2a02692dbb87;hpb=1442690c6593c89a136ad7db40aed1fc78932e50;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/message.rb b/lib/rbot/message.rb index 901626ec..4da511ed 100644 --- a/lib/rbot/message.rb +++ b/lib/rbot/message.rb @@ -22,6 +22,10 @@ module Irc :default => ':', :wizard => true, :desc => "when replying with nick put this character after the nick of the user the bot is replying to" ) + Config.register BooleanValue.new('core.private_replies', + :default => false, + :desc => 'Should the bot reply to private instead of the channel?' + ) end end @@ -155,7 +159,7 @@ module Irc ret << ' plainmessage=' << plainmessage.inspect ret << fields if fields ret << ' (identified)' if identified? - ret << ' (addressed to me)' if identified? + ret << ' (addressed to me)' if address? ret << ' (replied)' if replied? ret << ' (ignored)' if ignored? ret << ' (in thread)' if in_thread? @@ -233,11 +237,6 @@ module Irc return @address end - # has this message been replied to by a plugin? - def replied? - return @replied - end - # strip mIRC colour escapes from a string def BasicUserMessage.stripcolour(string) return "" unless string @@ -362,6 +361,8 @@ module Irc @action = @ctcp == 'ACTION' debug "Received CTCP command #{@ctcp} with options #{@message} (action? #{@action})" @logmessage = @message.dup + @plainmessage = BasicUserMessage.strip_formatting(@message) + @message = BasicUserMessage.strip_initial_formatting(@message) end # free splitting for plugins @@ -393,26 +394,47 @@ module Irc # 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 plainreply(string, options={}) - @bot.say @replyto, string, options - @replied = true + reply string, {:nick => false}.merge(options) 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 + reply string, {:nick => true}.merge(options) end - # the default reply style is to nickreply unless the reply already contains - # the nick or core.reply_with_nick is set to false + # The general way to reply to a command. The following options are available: + # :nick [false, true, :auto] + # state if the nick of the user calling the command should be prepended + # :auto uses core.reply_with_nick # + # :to [:private, :public, :auto] + # where should the bot reply? + # :private always reply to the nick + # :public reply to the channel (if available) + # :auto uses core.private_replies + def reply(string, options={}) - if @bot.config['core.reply_with_nick'] and not string =~ /(?:^|\W)#{Regexp.escape(@source.to_s)}(?:$|\W)/ - return nickreply(string, options) + opts = {:nick => :auto, :to => :auto}.merge options + + if opts[:nick] == :auto + opts[:nick] = @bot.config['core.reply_with_nick'] end - plainreply(string, options) + + if !self.public? + opts[:to] = :private + elsif opts[:to] == :auto + opts[:to] = @bot.config['core.private_replies'] ? :private : :public + end + + if (opts[:nick] && + opts[:to] != :private && + string !~ /(?:^|\W)#{Regexp.escape(@source.to_s)}(?:$|\W)/) + string = "#{@source}#{@bot.config['core.nick_postfix']} #{string}" + end + to = (opts[:to] == :private) ? source : @channel + @bot.say to, string, options + @replied = true end # convenience method to reply to a message with an action. It's the @@ -434,7 +456,7 @@ module Irc # convenience method to reply "okay" in the current language to the # message def plainokay - self.plainreply @bot.lang.get("okay") + self.reply @bot.lang.get("okay"), :nick => false end # Like the above, but append the username @@ -445,16 +467,13 @@ module Irc str.gsub!(/[!,.]$/,"") str += ", #{@source}" end - self.plainreply str + self.reply str, :nick => false end # the default okay style is the same as the default reply style # def okay - if @bot.config['core.reply_with_nick'] - return nickokay - end - plainokay + @bot.config['core.reply_with_nick'] ? nickokay : plainokay end # send a NOTICE to the message source @@ -467,17 +486,17 @@ module Irc # class to manage IRC PRIVMSGs class PrivMessage < UserMessage - def initialize(bot, server, source, target, message) - @msg_wants_id = true - super + def initialize(bot, server, source, target, message, opts={}) + @msg_wants_id = opts[:handle_id] + super(bot, server, source, target, message) end end # class to manage IRC NOTICEs class NoticeMessage < UserMessage - def initialize(bot, server, source, target, message) - @msg_wants_id = true - super + def initialize(bot, server, source, target, message, opts={}) + @msg_wants_id = opts[:handle_id] + super(bot, server, source, target, message) end end @@ -523,6 +542,7 @@ module Irc attr_accessor :is_on def initialize(bot, server, source, oldnick, newnick) super(bot, server, source, oldnick, newnick) + @address = (source == @bot.myself) @is_on = [] end @@ -556,6 +576,21 @@ module Irc end end + # class to manage WHOIS replies + class WhoisMessage < BasicUserMessage + attr_reader :whois + def initialize(bot, server, source, target, whois) + super(bot, server, source, target, "") + @address = (target == @bot.myself) + @whois = whois + end + + def inspect + fields = ' whois=' << whois.inspect + super(fields) + end + end + # class to manage NAME replies class NamesMessage < BasicUserMessage attr_accessor :users