X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Fmessage.rb;h=ba0d8cc9762f0e851ae67abe9086b364c2c3d832;hb=973260ba7343198da6074913d3aaee58ad667358;hp=969dbc7dc00105d9168eb7f55334b1d147f39ba5;hpb=0d5d3a20e1185e162102c7b8bea87962729f910a;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/message.rb b/lib/rbot/message.rb index 969dbc7d..ba0d8cc9 100644 --- a/lib/rbot/message.rb +++ b/lib/rbot/message.rb @@ -4,20 +4,27 @@ # :title: IRC message datastructures module Irc - BotConfig.register BotConfigArrayValue.new('core.address_prefix', - :default => [], :wizard => true, - :desc => "what non nick-matching prefixes should the bot respond to as if addressed (e.g !, so that '!foo' is treated like 'rbot: foo')" - ) - 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" - ) + class Bot + module Config + Config.register ArrayValue.new('core.address_prefix', + :default => [], :wizard => true, + :desc => "what non nick-matching prefixes should the bot respond to as if addressed (e.g !, so that '!foo' is treated like 'rbot: foo')" + ) + + Config.register BooleanValue.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!')" + ) + + Config.register StringValue.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" + ) + end + end + # Define standard IRC attriubtes (not so standard actually, # but the closest thing we have ...) @@ -63,7 +70,7 @@ module Irc # Convert a String or Symbol into a color number def Irc.find_color(data) - if Integer === data + "%02d" % if Integer === data data else f = if String === data @@ -84,10 +91,10 @@ module Irc def Irc.color(fg=nil,bg=nil) str = Color.dup if fg - str << Irc.find_color(fg).to_s + str << Irc.find_color(fg) end if bg - str << "," << Irc.find_color(bg).to_s + str << "," << Irc.find_color(bg) end return str end @@ -115,9 +122,22 @@ module Irc # contents of the message attr_accessor :message + # contents of the message (for logging purposes) + attr_accessor :logmessage + # has the message been replied to/handled by a plugin? attr_accessor :replied + # should the message be ignored? + attr_accessor :ignored + alias :ignored? :ignored + + # should the message handler be excuted in new thread? + # if set to true or false, this overrides :thread option in map. if it's nil, + # the map option takes effect + attr_accessor :thread + alias :thread? :thread + # instantiate a new Message # bot:: associated bot class # server:: Server where the message took place @@ -135,6 +155,8 @@ module Irc @message = BasicUserMessage.stripcolour message @replied = false @server = server + @ignored = false + @thread = nil @identified = false if @msg_wants_id && @server.capabilities[:"identify-msg"] @@ -145,6 +167,7 @@ module Irc warning "Message does not have identification" end end + @logmessage = @message.dup if target && target == @bot.myself @address = true @@ -167,7 +190,7 @@ module Irc # Access the botuser corresponding to the source, if any # def botuser - m.source.botuser rescue @bot.auth.everyone + source.botuser rescue @bot.auth.everyone end @@ -199,6 +222,15 @@ module Irc end + # class for handling welcome messages from the server + class WelcomeMessage < BasicUserMessage + end + + # class for handling MOTD from the server. Yes, MotdMessage + # is somewhat redundant, but it fits with the naming scheme + class MotdMessage < BasicUserMessage + end + # class for handling IRC user messages. Includes some utilities for handling # the message, for example in plugins. # The +message+ member will have any bot addressing "^bot: " removed @@ -276,6 +308,7 @@ module Irc @message = $3 || String.new @action = @ctcp == 'ACTION' debug "Received CTCP command #{@ctcp} with options #{@message} (action? #{@action})" + @logmessage = @message.dup end # free splitting for plugins @@ -322,7 +355,7 @@ module Irc # 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/ + if @bot.config['core.reply_with_nick'] and not string =~ /(?:^|\W)#{Regexp.escape(@source.to_s)}(?:$|\W)/ return nickreply(string, options) end plainreply(string, options) @@ -370,6 +403,12 @@ module Irc plainokay end + # send a NOTICE to the message source + # + def notify(msg,opts={}) + @bot.notice(sourcenick, msg, opts) + end + end # class to manage IRC PRIVMSGs @@ -401,11 +440,26 @@ module Irc end end + # class to manage IRC INVITEs + # +address?+ can be used as a shortcut to see if the bot was invited, + # which should be true except for server bugs + class InviteMessage < BasicUserMessage + # channel user was invited to + attr_reader :channel + + def initialize(bot, server, source, target, channel, message="") + super(bot, server, source, target, message) + @channel = channel + end + end + # class to pass IRC Nick changes in. @message contains the old nickame, # @sourcenick contains the new one. class NickMessage < BasicUserMessage + attr_accessor :is_on def initialize(bot, server, source, oldnick, newnick) super(bot, server, source, oldnick, newnick) + @is_on = [] end def oldnick @@ -417,9 +471,30 @@ module Irc end end + # class to manage mode changes + class ModeChangeMessage < BasicUserMessage + attr_accessor :modes + def initialize(bot, server, source, target, message="") + super(bot, server, source, target, message) + @address = (source == @bot.myself) + @modes = [] + end + end + + # class to manage NAME replies + class NamesMessage < BasicUserMessage + attr_accessor :users + def initialize(bot, server, source, target, message="") + super(bot, server, source, target, message) + @users = [] + end + end + class QuitMessage < BasicUserMessage + attr_accessor :was_on def initialize(bot, server, source, target, message="") super(bot, server, source, target, message) + @was_on = [] end end @@ -431,11 +506,14 @@ module Irc # topic set on channel attr_reader :channel + # :info if topic info, :set if topic set + attr_accessor :info_or_set def initialize(bot, server, source, channel, topic=ChannelTopic.new) super(bot, server, source, channel, topic.text) @topic = topic @timestamp = topic.set_on @channel = channel + @info_or_set = nil end end @@ -455,4 +533,7 @@ module Irc # same as a join, but can have a message too class PartMessage < JoinMessage end + + class UnknownMessage < BasicUserMessage + end end