Class: IrcLogModule

Inherits:
CoreBotModule
  • Object
show all
Defined in:
/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb

Overview

– vim:sw=2:et ++

:title: rbot IRC logging facilities

Author

Giuseppe “Oblomov” Bilotta <giuseppe.bilotta@gmail.com>

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (IrcLogModule) initialize

Returns a new instance of IrcLogModule



31
32
33
34
35
36
37
38
39
40
41
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 31

def initialize
  super
  @queue = Queue.new
  @thread = Thread.new { loggers_thread }
  @logs = Hash.new
  logdir = @bot.path 'logs'
  Dir.mkdir(logdir) unless File.exist?(logdir)
  # TODO what shall we do if the logdir couldn't be created? (e.g. it existed as a file)
  event_irclog_list_changed(@bot.config['irclog.no_log'], @bot.config['irclog.do_log'])
  @fn_format = @bot.config['irclog.filename_format']
end

Instance Attribute Details

- (Object) nolog_rx (readonly)

Returns the value of attribute nolog_rx



30
31
32
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 30

def nolog_rx
  @nolog_rx
end

Instance Method Details

- (Object) can_log_on(where)



43
44
45
46
47
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 43

def can_log_on(where)
  return true if @dolog_rx and where.match @dolog_rx
  return false if @nolog_rx and where.match @nolog_rx
  return true
end

- (Object) cleanup



77
78
79
80
81
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 77

def cleanup
  @queue << nil
  @thread.join
  @thread = nil
end

- (Object) event_irclog_list_changed(nolist, dolist)



53
54
55
56
57
58
59
60
61
62
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 53

def event_irclog_list_changed(nolist, dolist)
  @nolog_rx = nolist.empty? ? nil : Regexp.union(*(nolist.map { |r| r.to_irc_regexp }))
  debug "no log: #{@nolog_rx}"
  @dolog_rx = dolist.empty? ? nil : Regexp.union(*(dolist.map { |r| r.to_irc_regexp }))
  debug "do log: #{@dolog_rx}"
  @logs.inject([]) { |ar, kv|
    ar << kv.first unless can_log_on(kv.first)
    ar
  }.each { |w| logfile_close(w, 'logging disabled here') }
end

- (Object) irclog(message, where = "server")

log IRC-related message message to a file determined by where. where can be a channel name, or a nick for private message logging



73
74
75
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 73

def irclog(message, where="server")
  @queue.push [message, where]
end

- (Object) listen(m)



118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 118

def listen(m)
  case m
  when PrivMessage
    method = 'log_message'
  else
    method = 'log_' + m.class.name.downcase.match(/^irc::(\w+)message$/).captures.first
  end
  if self.respond_to?(method)
    self.__send__(method, m)
  else
    warning "unhandled logging for #{m.pretty_inspect} (no such method #{method})"
    unknown_message(m)
  end
end

- (Object) log_join(m)



194
195
196
197
198
199
200
201
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 194

def log_join(m)
  if m.address?
    debug "joined channel #{m.channel}"
    irclog "@ Joined channel #{m.channel}", m.channel
  else
    irclog "@ #{m.source} joined channel #{m.channel}", m.channel
  end
end

- (Object) log_kick(m)



212
213
214
215
216
217
218
219
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 212

def log_kick(m)
  if(m.address?)
    debug "kicked from channel #{m.channel}"
    irclog "@ You have been kicked from #{m.channel} by #{m.source} (#{m.logmessage})", m.channel
  else
    irclog "@ #{m.target} has been kicked from #{m.channel} by #{m.source} (#{m.logmessage})", m.channel
  end
end

- (Object) log_message(m)



133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 133

def log_message(m)
  if m.ctcp
    who = m.private? ? "me" : m.target
    logtarget = m.private? ? m.source : m.target
    case m.ctcp.intern
    when :ACTION
      if m.public?
        irclog "* #{m.source} #{m.logmessage}", m.target
      else
        irclog "* #{m.source}(#{m.sourceaddress}) #{m.logmessage}", m.source
      end
    when :VERSION
      irclog "@ #{m.source} asked #{who} about version info", logtarget
    when :SOURCE
      irclog "@ #{m.source} asked #{who} about source info", logtarget
    when :PING
      irclog "@ #{m.source} pinged #{who}", logtarget
    when :TIME
      irclog "@ #{m.source} asked #{who} what time it is", logtarget
    else
      irclog "@ #{m.source} asked #{who} about #{[m.ctcp, m.message].join(' ')}", logtarget
    end
  else
    if m.public?
      irclog "<#{m.source}> #{m.logmessage}", m.target
    else
      irclog "<#{m.source}(#{m.sourceaddress})> #{m.logmessage}", m.source
    end
  end
end

- (Object) log_nick(m)



178
179
180
181
182
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 178

def log_nick(m)
  (m.is_on & @bot.myself.channels).each { |ch|
    irclog "@ #{m.oldnick} is now known as #{m.newnick}", ch
  }
end

- (Object) log_notice(m)



164
165
166
167
168
169
170
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 164

def log_notice(m)
  if m.private?
    irclog "-#{m.source}(#{m.sourceaddress})- #{m.logmessage}", m.source
  else
    irclog "-#{m.source}- #{m.logmessage}", m.target
  end
end

- (Object) log_part(m)



203
204
205
206
207
208
209
210
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 203

def log_part(m)
  if(m.address?)
    debug "left channel #{m.channel}"
    irclog "@ Left channel #{m.channel} (#{m.logmessage})", m.channel
  else
    irclog "@ #{m.source} left channel #{m.channel} (#{m.logmessage})", m.channel
  end
end

- (Object) log_quit(m)



184
185
186
187
188
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 184

def log_quit(m)
  (m.was_on & @bot.myself.channels).each { |ch|
    irclog "@ Quit: #{m.source}: #{m.logmessage}", ch
  }
end

- (Object) log_topic(m)

def log_invite(m)

# TODO

end



225
226
227
228
229
230
231
232
233
234
235
236
237
238
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 225

def log_topic(m)
  case m.info_or_set
  when :set
    if m.source == @bot.myself
      irclog "@ I set topic \"#{m.topic}\"", m.channel
    else
      irclog "@ #{m.source} set topic \"#{m.topic}\"", m.channel
    end
  when :info
    topic = m.channel.topic
    irclog "@ Topic is \"#{m.topic}\"", m.channel
    irclog "@ Topic set by #{topic.set_by} on #{topic.set_on}", m.channel
  end
end

- (Object) logfile_close(where_str, reason = 'unknown reason')



64
65
66
67
68
69
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 64

def logfile_close(where_str, reason = 'unknown reason')
  f = @logs.delete(where_str) or return
  stamp = timestamp(Time.now)
  f[1].puts "#{stamp} @ Log closed by #{@bot.myself.nick} (#{reason})"
  f[1].close
end

- (Object) logfilepath(where_str, now)



248
249
250
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 248

def logfilepath(where_str, now)
  @bot.path('logs', now.strftime(@fn_format) % { :where => where_str })
end

- (Object) modechange(m)



190
191
192
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 190

def modechange(m)
  irclog "@ Mode #{m.logmessage} by #{m.source}", m.target
end

- (Object) motd(m)



172
173
174
175
176
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 172

def motd(m)
  m.message.each_line { |line|
    irclog "MOTD: #{line}", "server"
  }
end

- (Object) sent(m)



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 83

def sent(m)
  case m
  when NoticeMessage
    irclog "-#{m.source}- #{m.message}", m.target
  when PrivMessage
    logtarget = who = m.target
    if m.ctcp
      case m.ctcp.intern
      when :ACTION
        irclog "* #{m.source} #{m.logmessage}", logtarget
      when :VERSION
        irclog "@ #{m.source} asked #{who} about version info", logtarget
      when :SOURCE
        irclog "@ #{m.source} asked #{who} about source info", logtarget
      when :PING
        irclog "@ #{m.source} pinged #{who}", logtarget
      when :TIME
        irclog "@ #{m.source} asked #{who} what time it is", logtarget
      else
        irclog "@ #{m.source} asked #{who} about #{[m.ctcp, m.message].join(' ')}", logtarget
      end
    else
      irclog "<#{m.source}> #{m.logmessage}", logtarget
    end
  when QuitMessage
    m.was_on.each { |ch|
      irclog "@ quit (#{m.message})", ch
    }
  end
end

- (Object) timestamp(time)



49
50
51
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 49

def timestamp(time)
  return time.strftime(@bot.config['irclog.timestamp_format'])
end

- (Object) unknown_message(m)

def names(m)

# TODO

end



244
245
246
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 244

def unknown_message(m)
  irclog m.logmessage, ".unknown"
end

- (Object) welcome(m)



114
115
116
# File '/home/apoc/projects/ruby/rbot/lib/rbot/core/irclog.rb', line 114

def welcome(m)
  irclog "joined server #{m.server} as #{m.target}", "server"
end