]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/seen.rb
markov: refactor triplet learning
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / seen.rb
index 1a1681fb17861905e13f9d17955ffd01dabdaeaf..529fdf8695f3d3125c858f13c6400e601040d3bb 100644 (file)
@@ -49,33 +49,38 @@ 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)
+  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
 
@@ -87,22 +92,68 @@ class SeenPlugin < Plugin
 
     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")