]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/seen.rb
webhook: gitlab support
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / seen.rb
index 0fc6f0760f4dfcc91e8ac622f3e5f0fac3764c5c..717721e290d959f63139c5a55bf19066156511c1 100644 (file)
@@ -8,9 +8,31 @@
 define_structure :Saw, :nick, :time, :type, :where, :message
 
 class SeenPlugin < Plugin
+
+  MSG_PUBLIC = N_("saying \"%{message}\" in %{where}")
+  MSG_ACTION = N_("doing *%{nick} %{message}* in %{where}")
+  MSG_NICK = N_("changing nick from %{nick} to %{message}")
+  MSG_PART = N_("leaving %{where} (%{message})")
+  MSG_PART_EMPTY = N_("leaving %{where}")
+  MSG_JOIN = N_("joining %{where}")
+  MSG_QUIT = N_("quitting IRC (%{message})")
+  MSG_TOPIC = N_("changing the topic of %{where} to \"%{message}\"")
+
+  CHANPRIV_CHAN      = N_("a private channel")
+  CHANPRIV_MSG_TOPIC  = N_("changing the topic of %{where}")
+
+  MSGPRIV_MSG_PUBLIC = N_("speaking in %{where}")
+  MSGPRIV_MSG_ACTION = N_("doing something in %{where}")
+
+  FORMAT_NORMAL = N_("%{nick} was last seen %{when}, %{doing}")
+  FORMAT_WITH_BEFORE = N_("%{nick} was last seen %{when}, %{doing} and %{time} before %{did_before}")
+
   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)."))
+  Config.register Config::ArrayValue.new('seen.ignore_patterns',
+    :default => [ "^no u$" ],
+    :desc => _("Strings/regexes that you'd like to ignore for 'last message' purposes"))
 
   def help(plugin, topic="")
     _("seen <nick> => have you seen, or when did you last see <nick>")
@@ -48,6 +70,10 @@ class SeenPlugin < Plugin
     case m
     when PrivMessage
       return if m.private?
+      @bot.config['seen.ignore_patterns'].each { |regex|
+        return if m.message =~ /#{regex}/
+      }
+
       type = m.action? ? 'ACTION' : 'PUBLIC'
       store m, Saw.new(m.sourcenick.dup, now, type,
                        m.target.to_s, m.message.dup)
@@ -85,21 +111,39 @@ class SeenPlugin < Plugin
       before = reg.first
     end
 
+    # TODO: a message should not be disclosed if:
+    # - it was said in a channel that was/is invite-only, private or secret
+    # - UNLESS the requester is also in the channel now, or the request is made
+    #   in the channel?
+    msg_privacy = false
+    # TODO: a channel or it's topic should not be disclosed if:
+    # - the channel was/is private or secret
+    # - UNLESS the requester is also in the channel now, or the request is made
+    #   in the channel?
+    chan_privacy = false
+
+    # What should be displayed for channel?
+    where = chan_privacy ? _(CHANPRIV_CHAN) : saw.where
+
     formats = {
-      :normal      => _("%{nick} was last seen %{when}, %{doing}"),
-      :with_before => _("%{nick} was last seen %{when}, %{doing} and %{time} before %{did_before}")
+      :normal      => _(FORMAT_NORMAL),
+      :with_before => _(FORMAT_WITH_BEFORE)
     }
 
     if before && [:PART, :QUIT].include?(saw.type.to_sym) &&
        [:PUBLIC, :ACTION].include?(before.type.to_sym)
+      # TODO see chan_privacy
+      prev_chan_privacy = false
+      prev_where = prev_chan_privacy ? _(CHANPRIV_CHAN) : before.where
       did_before = case before.type.to_sym
       when :PUBLIC
-        _("saying \"%{message}\"")
+        _(msg_privacy ? MSGPRIV_MSG_PUBLIC : MSG_PUBLIC)
       when :ACTION
-        _("doing *%{nick} %{message}*")
+        _(msg_privacy ? MSGPRIV_MSG_ACTION : MSG_ACTION)
       end % {
         :nick => saw.nick,
-        :message => before.message
+        :message => before.message,
+        :where => prev_where
       }
 
       format = :with_before
@@ -127,24 +171,24 @@ class SeenPlugin < Plugin
 
     doing = case saw.type.to_sym
     when :PUBLIC
-      _("saying \"%{message}\"")
+      _(msg_privacy ? MSGPRIV_MSG_PUBLIC : MSG_PUBLIC)
     when :ACTION
-      _("doing *%{message}*")
+      _(msg_privacy ? MSGPRIV_MSG_ACTION : MSG_ACTION)
     when :NICK
-      _("changing nick from %{nick} to %{message}")
+      _(MSG_NICK)
     when :PART
       if saw.message.empty?
-        _("leaving %{where}")
+        _(MSG_PART_EMPTY)
       else
-        _("leaving %{where} (%{message})")
+        _(MSG_PART)
       end
     when :JOIN
-      _("joining %{where}")
+      _(MSG_JOIN)
     when :QUIT
-      _("quitting IRC (%{message})")
+      _(MSG_QUIT)
     when :TOPIC
-      _("changing the topic of %{where} to \"%{message}\"")
-    end % { :message => saw.message, :where => saw.where, :nick => saw.nick }
+      _(chan_privacy ? CHANPRIV_MSG_TOPIC : MSG_TOPIC)
+    end % { :message => saw.message, :where => where, :nick => saw.nick }
 
     case format
     when :normal
@@ -165,6 +209,9 @@ class SeenPlugin < Plugin
   end
 
   def store(m, saw)
+    # TODO: we need to store the channel state INVITE/SECRET/PRIVATE here, in
+    # some symbolic form, so that we know the prior state of the channel when
+    # it comes time to display.
     reg = @registry[saw.nick]
 
     if reg && reg.is_a?(Array)