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