]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blob - lib/rbot/core/irclog.rb
6058a17a370dfc253eb0fdcc25e514242c4f463a
[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 message(m)
62     if(m.action?)
63       if(m.private?)
64         irclog "* [#{m.source}(#{m.sourceaddress})] #{m.logmessage}", m.source
65       else
66         irclog "* #{m.source} #{m.logmessage}", m.target
67       end
68     else
69       if(m.public?)
70         irclog "<#{m.source}> #{m.logmessage}", m.target
71       else
72         irclog "[#{m.source}(#{m.sourceaddress})] #{m.logmessage}", m.source
73       end
74     end
75   end
76
77   def notice(m)
78     if m.private?
79       irclog "-#{m.source}- #{m.message}", m.source
80     else
81       irclog "-#{m.source}- #{m.message}", m.target
82     end
83   end
84
85   def motd(m)
86     m.message.each_line { |line|
87       irclog "MOTD: #{line}", "server"
88     }
89   end
90
91   def nick(m)
92     m.is_on.each { |ch|
93       irclog "@ #{m.oldnick} is now known as #{m.newnick}", ch
94     }
95   end
96
97   def quit(m)
98     m.was_on.each { |ch|
99       irclog "@ Quit: #{m.source}: #{m.message}", ch
100     }
101   end
102
103   def modechange(m)
104     irclog "@ Mode #{m.message} by #{m.source}", m.target
105   end
106
107   def join(m)
108     if m.address?
109       debug "joined channel #{m.channel}"
110       irclog "@ Joined channel #{m.channel}", m.channel
111     else
112       irclog "@ #{m.source} joined channel #{m.channel}", m.channel
113     end
114   end
115
116   def part(m)
117     if(m.address?)
118       debug "left channel #{m.channel}"
119       irclog "@ Left channel #{m.channel} (#{m.logmessage})", m.channel
120     else
121       irclog "@ #{m.source} left channel #{m.channel} (#{m.logmessage})", m.channel
122     end
123   end
124
125   def kick(m)
126     if(m.address?)
127       debug "kicked from channel #{m.channel}"
128       irclog "@ You have been kicked from #{m.channel} by #{m.source} (#{m.logmessage})", m.channel
129     else
130       irclog "@ #{m.target} has been kicked from #{m.channel} by #{m.source} (#{m.logmessage})", m.channel
131     end
132   end
133
134   # def invite(m)
135   #   # TODO
136   # end
137
138   def topic(m)
139     case m.info_or_set
140     when :set
141       if m.source == @bot.myself
142         irclog "@ I set topic \"#{m.topic}\"", m.channel
143       else
144         irclog "@ #{m.source} set topic \"#{m.topic}\"", m.channel
145       end
146     when :info
147       topic = m.channel.topic
148       irclog "@ Topic is \"#{m.topic}\"", m.channel
149       irclog "@ Topic set by #{topic.set_by} on #{topic.set_on}", m.channel
150     end
151   end
152
153   # def names(m)
154   #   # TODO
155   # end
156
157   def unknown_message(m)
158     irclog m.message, ".unknown"
159   end
160 end
161
162 ilm = IrcLogModule.new
163 ilm.priority = -1
164