4 # :title: rbot IRC logging facilities
6 # Author:: Giuseppe "Oblomov" Bilotta <giuseppe.bilotta@gmail.com>
7 # Copyright:: (C) 2008 Giuseppe Bilotta
10 class IrcLogModule < CoreBotModule
15 Dir.mkdir("#{@bot.botclass}/logs") unless File.exist?("#{@bot.botclass}/logs")
18 # log IRC-related message +message+ to a file determined by +where+.
19 # +where+ can be a channel name, or a nick for private message logging
20 def irclog(message, where="server")
21 message = message.chomp
22 stamp = Time.now.strftime("%Y/%m/%d %H:%M:%S")
23 if where.class <= Server
26 where_str = where.downcase.gsub(/[:!?$*()\/\\<>|"']/, "_")
28 unless(@logs.has_key?(where_str))
29 @logs[where_str] = File.new("#{@bot.botclass}/logs/#{where_str}", "a")
30 @logs[where_str].sync = true
32 @logs[where_str].puts "[#{stamp}] #{message}"
33 #debug "[#{stamp}] <#{where}> #{message}"
40 irclog "-=#{m.source}=- #{m.message}", m.target
42 irclog "[-=#{m.source}=-] #{m.message}", m.target
46 irclog "<#{m.source}> #{m.message}", m.target
48 irclog "[msg(#{m.target})] #{m.message}", m.target
52 irclog "@ quit (#{m.message})", ch
58 irclog "joined server #{m.server} as #{m.target}", "server"
64 method = 'log_message'
66 method = 'log_' + m.class.name.downcase.match(/^irc::(\w+)message$/).captures.first
68 if self.respond_to?(method)
69 self.__send__(method, m)
71 warning "unhandled logging for #{m.pretty_inspect} (no such method #{method})"
78 who = m.private? ? "me" : m.target
79 logtarget = m.private? ? m.source : m.target
83 irclog "* #{m.source} #{m.logmessage}", m.target
85 irclog "* [#{m.source}(#{m.sourceaddress})] #{m.logmessage}", m.source
88 irclog "@ #{m.source} asked #{who} about version info", logtarget
90 irclog "@ #{m.source} asked #{who} about source info", logtarget
92 irclog "@ #{m.source} pinged #{who}", logtarget
94 irclog "@ #{m.source} asked #{who} what time it is", logtarget
96 irclog "@ #{m.source} asked #{who} about #{[m.ctcp, m.message].join(' ')}", logtarget
100 irclog "<#{m.source}> #{m.logmessage}", m.target
102 irclog "[#{m.source}(#{m.sourceaddress})] #{m.logmessage}", m.source
109 irclog "-#{m.source}- #{m.message}", m.source
111 irclog "-#{m.source}- #{m.message}", m.target
116 m.message.each_line { |line|
117 irclog "MOTD: #{line}", "server"
123 irclog "@ #{m.oldnick} is now known as #{m.newnick}", ch
129 irclog "@ Quit: #{m.source}: #{m.message}", ch
134 irclog "@ Mode #{m.message} by #{m.source}", m.target
139 debug "joined channel #{m.channel}"
140 irclog "@ Joined channel #{m.channel}", m.channel
142 irclog "@ #{m.source} joined channel #{m.channel}", m.channel
148 debug "left channel #{m.channel}"
149 irclog "@ Left channel #{m.channel} (#{m.logmessage})", m.channel
151 irclog "@ #{m.source} left channel #{m.channel} (#{m.logmessage})", m.channel
157 debug "kicked from channel #{m.channel}"
158 irclog "@ You have been kicked from #{m.channel} by #{m.source} (#{m.logmessage})", m.channel
160 irclog "@ #{m.target} has been kicked from #{m.channel} by #{m.source} (#{m.logmessage})", m.channel
171 if m.source == @bot.myself
172 irclog "@ I set topic \"#{m.topic}\"", m.channel
174 irclog "@ #{m.source} set topic \"#{m.topic}\"", m.channel
177 topic = m.channel.topic
178 irclog "@ Topic is \"#{m.topic}\"", m.channel
179 irclog "@ Topic set by #{topic.set_by} on #{topic.set_on}", m.channel
187 def unknown_message(m)
188 irclog m.message, ".unknown"
192 ilm = IrcLogModule.new