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
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
}
reply string, {:nick => true}.merge(options)
end
+ # 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={})
- opts = {:nick => :auto, :to => :auto}.merge options
+ opts = {:nick => :auto, :forcenick => false, :to => :auto}.merge options
if opts[:nick] == :auto
opts[:nick] = @bot.config['core.reply_with_nick']
if (opts[:nick] &&
opts[:to] != :private &&
- string !~ /(?:^|\W)#{Regexp.escape(@source.to_s)}(?:$|\W)/)
+ (string !~ /(?:^|\W)#{Regexp.escape(@source.to_s)}(?:$|\W)/ ||
+ opts[:forcenick]))
string = "#{@source}#{@bot.config['core.nick_postfix']} #{string}"
end
to = (opts[:to] == :private) ? source : @channel
@bot.ctcp_notice @source, @ctcp, string, options
end
- # convenience method to reply "okay" in the current language to the
- # message
- def plainokay
- self.reply @bot.lang.get("okay"), :nick => false
+ # convenience method to reply a literal message in the current language to the message
+ def plain_literal(ident)
+ self.reply @bot.lang.get(ident), :nick => false
end
# Like the above, but append the username
- def nickokay
- str = @bot.lang.get("okay").dup
+ def nick_literal(ident)
+ str = @bot.lang.get(ident).dup
if self.public?
# remove final punctuation
str.gsub!(/[!,.]$/,"")
end
# the default okay style is the same as the default reply style
- #
def okay
- @bot.config['core.reply_with_nick'] ? nickokay : plainokay
+ @bot.config['core.reply_with_nick'] ? nick_literal('okay') : plain_literal('okay')
+ end
+
+ # thanks the user in reply
+ def thanks
+ @bot.config['core.reply_with_nick'] ? nick_literal('thanks') : plain_literal('thanks')
end
# send a NOTICE to the message source
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