1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
#-- vim:sw=2:et
#++
#
# :title: Seen Plugin
#
# Keep a database of who last said/did what
define_structure :Saw, :nick, :time, :type, :where, :message
class SeenPlugin < Plugin
def help(plugin, topic="")
"seen <nick> => have you seen, or when did you last see <nick>"
end
def privmsg(m)
unless(m.params =~ /^(\S)+$/)
m.reply "incorrect usage: " + help(m.plugin)
return
end
m.params.gsub!(/\?$/, "")
if @registry.has_key?(m.params)
m.reply seen(@registry[m.params])
else
m.reply "nope!"
end
end
def listen(m)
return unless m.source
# keep database up to date with who last said what
now = Time.new
case m
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)
when QuitMessage
return if m.address?
@registry[m.sourcenick] = 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
when PartMessage
return if m.address?
@registry[m.sourcenick] = 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)
when TopicMessage
return if m.address?
@registry[m.sourcenick] = Saw.new(m.sourcenick.dup, Time.new, "TOPIC",
m.target.to_s, m.message.dup)
end
end
def seen(saw)
ret = "#{saw.nick} was last seen "
ago = Time.new - saw.time
if (ago.to_i == 0)
ret << "just now, "
else
ret << Utils.secs_to_string(ago) + " ago, "
end
case saw.type.to_sym
when :PUBLIC
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}"
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}"
end
end
end
plugin = SeenPlugin.new
plugin.register("seen")
|