]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blob - lib/rbot/core/irclog.rb
fcaf1b7533d8e013ca1e3460a45e9b9b9dc7ecf7
[user/henk/code/ruby/rbot.git] / lib / rbot / core / irclog.rb
1 #-- vim:sw=2:et
2 #++
3 #
4 # :title: rbot IRC logging facilities
5 #
6 # Author:: Giuseppe "Oblomov" Bilotta <giuseppe.bilotta@gmail.com>
7 # Copyright:: (C) 2008 Giuseppe Bilotta
8 # License:: GPL v2
9
10 class IrcLogModule < CoreBotModule
11   
12   def initialize
13     super
14     @logs = Hash.new
15     Dir.mkdir("#{@bot.botclass}/logs") unless File.exist?("#{@bot.botclass}/logs")
16   end
17
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
24       where_str = "server"
25     else
26       where_str = where.downcase.gsub(/[:!?$*()\/\\<>|"']/, "_")
27     end
28     unless(@logs.has_key?(where_str))
29       f = File.new("#{@bot.botclass}/logs/#{where_str}", "a")
30       f.sync = true
31       f.puts "[#{stamp}] @ Log started by #{@bot.myself.nick}"
32       @logs[where_str] = f
33     end
34     @logs[where_str].puts "[#{stamp}] #{message}"
35     #debug "[#{stamp}] <#{where}> #{message}"
36   end
37
38   def sent(m)
39     case m
40     when NoticeMessage
41       irclog "-#{m.source}- #{m.message}", m.target
42     when PrivMessage
43       irclog "<#{m.source}> #{m.message}", m.target
44     when QuitMessage
45       m.was_on.each { |ch|
46         irclog "@ quit (#{m.message})", ch
47       }
48     end
49   end
50
51   def welcome(m)
52     irclog "joined server #{m.server} as #{m.target}", "server"
53   end
54
55   def listen(m)
56     case m
57     when PrivMessage
58       method = 'log_message'
59     else
60       method = 'log_' + m.class.name.downcase.match(/^irc::(\w+)message$/).captures.first
61     end
62     if self.respond_to?(method)
63       self.__send__(method, m)
64     else
65       warning "unhandled logging for #{m.pretty_inspect} (no such method #{method})"
66       unknown_message(m)
67     end
68   end
69
70   def log_message(m)
71     if m.ctcp
72       who = m.private? ? "me" : m.target
73       logtarget = m.private? ? m.source : m.target
74       case m.ctcp.intern
75       when :ACTION
76         if m.public?
77           irclog "* #{m.source} #{m.logmessage}", m.target
78         else
79           irclog "* #{m.source}(#{m.sourceaddress}) #{m.logmessage}", m.source
80         end
81       when :VERSION
82         irclog "@ #{m.source} asked #{who} about version info", logtarget
83       when :SOURCE
84         irclog "@ #{m.source} asked #{who} about source info", logtarget
85       when :PING
86         irclog "@ #{m.source} pinged #{who}", logtarget
87       when :TIME
88         irclog "@ #{m.source} asked #{who} what time it is", logtarget
89       else
90         irclog "@ #{m.source} asked #{who} about #{[m.ctcp, m.message].join(' ')}", logtarget
91       end
92     else
93       if m.public? 
94         irclog "<#{m.source}> #{m.logmessage}", m.target
95       else
96         irclog "<#{m.source}(#{m.sourceaddress})> #{m.logmessage}", m.source
97       end
98     end
99   end
100
101   def log_notice(m)
102     if m.private?
103       irclog "-#{m.source}(#{m.sourceaddress})- #{m.logmessage}", m.source
104     else
105       irclog "-#{m.source}- #{m.logmessage}", m.target
106     end
107   end
108
109   def motd(m)
110     m.message.each_line { |line|
111       irclog "MOTD: #{line}", "server"
112     }
113   end
114
115   def log_nick(m)
116     m.is_on.each { |ch|
117       irclog "@ #{m.oldnick} is now known as #{m.newnick}", ch
118     }
119   end
120
121   def log_quit(m)
122     m.was_on.each { |ch|
123       irclog "@ Quit: #{m.source}: #{m.logmessage}", ch
124     }
125   end
126
127   def modechange(m)
128     irclog "@ Mode #{m.logmessage} by #{m.source}", m.target
129   end
130
131   def log_join(m)
132     if m.address?
133       debug "joined channel #{m.channel}"
134       irclog "@ Joined channel #{m.channel}", m.channel
135     else
136       irclog "@ #{m.source} joined channel #{m.channel}", m.channel
137     end
138   end
139
140   def log_part(m)
141     if(m.address?)
142       debug "left channel #{m.channel}"
143       irclog "@ Left channel #{m.channel} (#{m.logmessage})", m.channel
144     else
145       irclog "@ #{m.source} left channel #{m.channel} (#{m.logmessage})", m.channel
146     end
147   end
148
149   def log_kick(m)
150     if(m.address?)
151       debug "kicked from channel #{m.channel}"
152       irclog "@ You have been kicked from #{m.channel} by #{m.source} (#{m.logmessage})", m.channel
153     else
154       irclog "@ #{m.target} has been kicked from #{m.channel} by #{m.source} (#{m.logmessage})", m.channel
155     end
156   end
157
158   # def log_invite(m)
159   #   # TODO
160   # end
161
162   def log_topic(m)
163     case m.info_or_set
164     when :set
165       if m.source == @bot.myself
166         irclog "@ I set topic \"#{m.topic}\"", m.channel
167       else
168         irclog "@ #{m.source} set topic \"#{m.topic}\"", m.channel
169       end
170     when :info
171       topic = m.channel.topic
172       irclog "@ Topic is \"#{m.topic}\"", m.channel
173       irclog "@ Topic set by #{topic.set_by} on #{topic.set_on}", m.channel
174     end
175   end
176
177   # def names(m)
178   #   # TODO
179   # end
180
181   def unknown_message(m)
182     irclog m.logmessage, ".unknown"
183   end
184 end
185
186 ilm = IrcLogModule.new
187 ilm.priority = -1
188