: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
- # Define standard IRC attriubtes (not so standard actually,
+ # Define standard IRC attributes (not so standard actually,
# but the closest thing we have ...)
Bold = "\002"
Underline = "\037"
:dark_gray => 14,
:lightgray => 15,
:light_gray => 15,
- :white => 16
+ :white => 0
}
# Convert a String or Symbol into a color number
data
end
if ColorCode.key?(f)
- ColorCode[f]
+ ColorCode[f]
else
0
end
ret << ' plainmessage=' << plainmessage.inspect
ret << fields if fields
ret << ' (identified)' if identified?
- ret << ' (addressed to me)' if address?
+ if address?
+ ret << ' (addressed to me'
+ ret << ', with prefix' if prefixed?
+ ret << ')'
+ end
ret << ' (replied)' if replied?
ret << ' (ignored)' if ignored?
ret << ' (in thread)' if in_thread?
@bot = bot
@source = source
@address = false
+ @prefixed = false
@target = target
@message = message || ""
@replied = false
return @address
end
+ # returns true if the messaged was addressed to the bot via the address
+ # prefix. This can be used to tell appart "!do this" from "botname, do this"
+ def prefixed?
+ return @prefixed
+ end
+
# strip mIRC colour escapes from a string
def BasicUserMessage.stripcolour(string)
return "" unless string
bot.config['core.address_prefix'].each {|mprefix|
if @message.gsub!(/^#{Regexp.escape(mprefix)}\s*/, "")
@address = true
+ @prefixed = true
break
end
}
# 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
+ # Same as nickreply, but always prepend the target's nick.
+ def nickreply!(string, options={})
+ reply string, {:nick => true, :forcenick => true}.merge(options)
+ end
+
+ # 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
+ #
+ # :forcenick [false, true]
+ # if :nick is true, always prepend the target's nick, even if the nick
+ # already appears in the reply. Defaults to false.
#
+ # :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, :forcenick => false, :to => :auto}.merge options
+
+ if opts[:nick] == :auto
+ opts[:nick] = @bot.config['core.reply_with_nick']
+ end
+
+ 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)/ ||
+ opts[:forcenick]))
+ string = "#{@source}#{@bot.config['core.nick_postfix']} #{string}"
end
- plainreply(string, options)
+ 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
# 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
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
attr_accessor :is_on
def initialize(bot, server, source, oldnick, newnick)
super(bot, server, source, oldnick, newnick)
+ @address = (source == @bot.myself)
@is_on = []
end
end
end
+ # class to manage LIST replies
+ class ListMessage < BasicUserMessage
+ attr_accessor :list
+ def initialize(bot, server, source, target, list=Hash.new)
+ super(bot, server, source, target, "")
+ @list = []
+ end
+
+ def inspect
+ fields = ' list=' << list.inspect
+ super(fields)
+ end
+ end
+
+
# class to manage NAME replies
class NamesMessage < BasicUserMessage
attr_accessor :users
end
end
+ # class to manager Ban list replies
+ class BanlistMessage < BasicUserMessage
+ # the bans
+ attr_accessor :bans
+
+ def initialize(bot, server, source, target, message="")
+ super(bot, server, source, target, message)
+ @bans = []
+ end
+
+ def inspect
+ fields = ' bans=' << bans.inspect
+ super(fields)
+ end
+ end
+
class QuitMessage < BasicUserMessage
attr_accessor :was_on
def initialize(bot, server, source, target, message="")
class PartMessage < JoinMessage
end
+ # class to handle ERR_NOSUCHNICK and ERR_NOSUCHCHANNEL
+ class NoSuchTargetMessage < BasicUserMessage
+ # the channel or nick that was not found
+ attr_reader :target
+
+ def initialize(bot, server, source, target, message='')
+ super(bot, server, source, target, message)
+
+ @target = target
+ end
+ end
+
class UnknownMessage < BasicUserMessage
end
end