X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Fseen.rb;h=0fc6f0760f4dfcc91e8ac622f3e5f0fac3764c5c;hb=682e7f1708b9534385467b3d707433cb256b6405;hp=ccfdb7261e11148cff3c20a6b00f2ea969de9524;hpb=86fada3ab193fd369c13323a8f03825493222df4;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/seen.rb b/data/rbot/plugins/seen.rb index ccfdb726..0fc6f076 100644 --- a/data/rbot/plugins/seen.rb +++ b/data/rbot/plugins/seen.rb @@ -8,10 +8,14 @@ define_structure :Saw, :nick, :time, :type, :where, :message class SeenPlugin < Plugin + Config.register Config::IntegerValue.new('seen.max_results', + :default => 3, :validate => Proc.new{|v| v >= 0}, + :desc => _("Maximum number of seen users to return in search (0 = no limit).")) + def help(plugin, topic="") - "seen => have you seen, or when did you last see " + _("seen => have you seen, or when did you last see ") end - + def privmsg(m) unless(m.params =~ /^(\S)+$/) m.reply "incorrect usage: " + help(m.plugin) @@ -23,7 +27,17 @@ class SeenPlugin < Plugin if @registry.has_key?(m.params) m.reply seen(@registry[m.params]) else - m.reply "nope!" + rx = Regexp.new(m.params, true) + num_matched = 0 + @registry.each {|nick, saw| + if nick.match(rx) + m.reply seen(saw) + num_matched += 1 + break if num_matched == @bot.config['seen.max_results'] + end + } + + m.reply _("nope!") if num_matched.zero? end end @@ -35,60 +49,137 @@ class SeenPlugin < Plugin 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) - ret = "#{saw.nick} was last seen " + + def seen(reg) + saw = case reg + when Struct::Saw + reg # for backwards compatibility + when Array + reg.last + end + + if reg.kind_of? Array + before = reg.first + end + + formats = { + :normal => _("%{nick} was last seen %{when}, %{doing}"), + :with_before => _("%{nick} was last seen %{when}, %{doing} and %{time} before %{did_before}") + } + + if before && [:PART, :QUIT].include?(saw.type.to_sym) && + [:PUBLIC, :ACTION].include?(before.type.to_sym) + did_before = case before.type.to_sym + when :PUBLIC + _("saying \"%{message}\"") + when :ACTION + _("doing *%{nick} %{message}*") + end % { + :nick => saw.nick, + :message => before.message + } + + format = :with_before + + time_diff = saw.time - before.time + if time_diff < 300 + time_before = _("a moment") + elsif time_diff < 3600 + time_before = _("a while") + else + format = :normal + end + else + format = :normal + end + + nick = saw.nick ago = Time.new - saw.time - + if (ago.to_i == 0) - ret << "just now, " + time = _("just now") else - ret << Utils.secs_to_string(ago) + " ago, " + time = _("%{time} ago") % { :time => Utils.secs_to_string(ago) } end - case saw.type.to_sym + doing = case saw.type.to_sym when :PUBLIC - ret << "saying #{saw.message}" + _("saying \"%{message}\"") when :ACTION - ret << "doing #{saw.nick} #{saw.message}" + _("doing *%{message}*") when :NICK - ret << "changing nick from #{saw.nick} to #{saw.message}" + _("changing nick from %{nick} to %{message}") when :PART - ret << "leaving #{saw.where}" + if saw.message.empty? + _("leaving %{where}") + else + _("leaving %{where} (%{message})") + end when :JOIN - ret << "joining #{saw.where}" + _("joining %{where}") when :QUIT - ret << "quitting IRC (#{saw.message})" + _("quitting IRC (%{message})") when :TOPIC - ret << "changing the topic of #{saw.where} to #{saw.message}" + _("changing the topic of %{where} to \"%{message}\"") + end % { :message => saw.message, :where => saw.where, :nick => saw.nick } + + case format + when :normal + formats[:normal] % { + :nick => saw.nick, + :when => time, + :doing => doing, + } + when :with_before + formats[:with_before] % { + :nick => saw.nick, + :when => time, + :doing => doing, + :time => time_before, + :did_before => did_before + } + end + 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")