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