]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blob - data/rbot/plugins/seen.rb
seen: If nick doesn't match exactly, fallback to a regexp search (#19).
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / seen.rb
1 #-- vim:sw=2:et
2 #++
3 #
4 # :title: Seen Plugin
5 #
6 # Keep a database of who last said/did what
7
8 define_structure :Saw, :nick, :time, :type, :where, :message
9
10 class SeenPlugin < Plugin
11   Config.register Config::IntegerValue.new('seen.max_results',
12     :default => 3, :validate => Proc.new{|v| v >= 0},
13     :desc => "Maximum number of seen users to return in search (0 = no limit).")
14
15   def help(plugin, topic="")
16     "seen <nick> => have you seen, or when did you last see <nick>"
17   end
18
19   def privmsg(m)
20     unless(m.params =~ /^(\S)+$/)
21       m.reply "incorrect usage: " + help(m.plugin)
22       return
23     end
24
25     m.params.gsub!(/\?$/, "")
26
27     if @registry.has_key?(m.params)
28       m.reply seen(@registry[m.params])
29     else
30       rx = Regexp.new(m.params, true)
31       num_matched = 0
32       @registry.each {|nick, saw|
33         if nick.match(rx)
34           m.reply seen(saw)
35           num_matched += 1
36           break if num_matched == @bot.config['seen.max_results']
37         end
38       }
39
40       m.reply "nope!" if num_matched.zero?
41     end
42   end
43
44   def listen(m)
45     return unless m.source
46     # keep database up to date with who last said what
47     now = Time.new
48     case m
49     when PrivMessage
50       return if m.private?
51       type = m.action? ? 'ACTION' : 'PUBLIC'
52       @registry[m.sourcenick] = Saw.new(m.sourcenick.dup, now, type,
53                                           m.target.to_s, m.message.dup)
54     when QuitMessage
55       return if m.address?
56       @registry[m.sourcenick] = Saw.new(m.sourcenick.dup, now, "QUIT",
57                                         nil, m.message.dup)
58     when NickMessage
59       return if m.address?
60       saw = Saw.new(m.oldnick, now, "NICK", nil, m.newnick)
61       @registry[m.oldnick] = saw
62       @registry[m.newnick] = saw
63     when PartMessage
64       return if m.address?
65       @registry[m.sourcenick] = Saw.new(m.sourcenick.dup, Time.new, "PART",
66                                         m.target.to_s, m.message.dup)
67     when JoinMessage
68       return if m.address?
69       @registry[m.sourcenick] = Saw.new(m.sourcenick.dup, Time.new, "JOIN",
70                                         m.target.to_s, m.message.dup)
71     when TopicMessage
72       return if m.address? or m.info_or_set == :info
73       @registry[m.sourcenick] = Saw.new(m.sourcenick.dup, Time.new, "TOPIC",
74                                         m.target.to_s, m.message.dup)
75     end
76   end
77
78   def seen(saw)
79     ret = "#{saw.nick} was last seen "
80     ago = Time.new - saw.time
81
82     if (ago.to_i == 0)
83       ret << "just now, "
84     else
85       ret << Utils.secs_to_string(ago) + " ago, "
86     end
87
88     case saw.type.to_sym
89     when :PUBLIC
90       ret << "saying #{saw.message}"
91     when :ACTION
92       ret << "doing #{saw.nick} #{saw.message}"
93     when :NICK
94       ret << "changing nick from #{saw.nick} to #{saw.message}"
95     when :PART
96       ret << "leaving #{saw.where}"
97     when :JOIN
98       ret << "joining #{saw.where}"
99     when :QUIT
100       ret << "quitting IRC (#{saw.message})"
101     when :TOPIC
102       ret << "changing the topic of #{saw.where} to #{saw.message}"
103     end
104   end
105
106 end
107 plugin = SeenPlugin.new
108 plugin.register("seen")