when PrivMessage
return if m.private?
type = m.action? ? 'ACTION' : 'PUBLIC'
- @registry[m.sourcenick] = Saw.new(m.sourcenick.dup, now, type,
- m.target.to_s, m.message.dup)
+ store m, Saw.new(m.sourcenick.dup, now, type,
+ m.target.to_s, m.message.dup)
when QuitMessage
return if m.address?
- @registry[m.sourcenick] = Saw.new(m.sourcenick.dup, now, "QUIT",
- nil, m.message.dup)
+ store m, Saw.new(m.sourcenick.dup, now, "QUIT",
+ nil, m.message.dup)
when NickMessage
return if m.address?
- saw = Saw.new(m.oldnick, now, "NICK", nil, m.newnick)
- @registry[m.oldnick] = saw
- @registry[m.newnick] = saw
+ store m, Saw.new(m.oldnick, now, "NICK", nil, m.newnick)
when PartMessage
return if m.address?
- @registry[m.sourcenick] = Saw.new(m.sourcenick.dup, Time.new, "PART",
- m.target.to_s, m.message.dup)
+ store m, Saw.new(m.sourcenick.dup, Time.new, "PART",
+ m.target.to_s, m.message.dup)
when JoinMessage
return if m.address?
- @registry[m.sourcenick] = Saw.new(m.sourcenick.dup, Time.new, "JOIN",
- m.target.to_s, m.message.dup)
+ store m, Saw.new(m.sourcenick.dup, Time.new, "JOIN",
+ m.target.to_s, m.message.dup)
when TopicMessage
return if m.address? or m.info_or_set == :info
- @registry[m.sourcenick] = Saw.new(m.sourcenick.dup, Time.new, "TOPIC",
- m.target.to_s, m.message.dup)
+ store m, Saw.new(m.sourcenick.dup, Time.new, "TOPIC",
+ m.target.to_s, m.message.dup)
end
end
- def seen(saw)
+ def seen(reg)
+ saw = case reg
+ when Struct::Saw
+ reg # for backwards compatibility
+ when Array
+ reg.last
+ end
+
ret = "#{saw.nick} was last seen "
ago = Time.new - saw.time
case saw.type.to_sym
when :PUBLIC
- ret << "saying #{saw.message}"
+ ret << "saying \"#{saw.message}\""
when :ACTION
ret << "doing #{saw.nick} #{saw.message}"
when :NICK
ret << "changing nick from #{saw.nick} to #{saw.message}"
when :PART
ret << "leaving #{saw.where}"
+ ret << " (#{saw.message})" unless saw.message.empty?
when :JOIN
ret << "joining #{saw.where}"
when :QUIT
ret << "quitting IRC (#{saw.message})"
when :TOPIC
- ret << "changing the topic of #{saw.where} to #{saw.message}"
+ ret << "changing the topic of #{saw.where} to \"#{saw.message}\""
+ end
+
+ case saw.type.to_sym
+ when :PART, :QUIT
+ before = reg.first
+ if before.type == "PUBLIC" || before.type == "ACTION"
+ time_diff = saw.time - before.time
+ if time_diff < 300
+ time = "a moment"
+ elsif time_diff < 3600
+ time = "a while"
+ else
+ return ret
+ end
+
+ ret << ' and %{time} before' % { :time => time }
+
+ if before.type == "PUBLIC"
+ ret << ' saying "%{message}"' % {
+ :message => before.message
+ }
+ elsif before.type == "ACTION"
+ ret << ' doing *%{message}*' % {
+ :nick => saw.nick,
+ :message => before.message
+ }
+ end
+ end
end
+ return ret
end
+ def store(m, saw)
+ reg = @registry[saw.nick]
+
+ if reg && reg.is_a?(Array)
+ reg.shift if reg.size > 1
+ reg.push(saw)
+ else
+ reg = [saw]
+ end
+
+ if m.is_a? NickMessage
+ @registry[m.newnick] = reg
+ end
+
+ @registry[saw.nick] = reg
+ end
end
plugin = SeenPlugin.new
plugin.register("seen")