]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - data/rbot/plugins/remind.rb
Fri Jul 29 13:07:56 BST 2005 Tom Gilbert <tom@linuxbrit.co.uk>
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / remind.rb
index 5ad980aeac8d33012da673e0c0594796d8100f32..f66c4fc8a40b79b7f9da4974df1c9f13cf6afc01 100644 (file)
@@ -1,6 +1,108 @@
 require 'rbot/utils'
 
 class RemindPlugin < Plugin
+  # read a time in string format, turn it into "seconds from now".
+  # example formats handled are "5 minutes", "2 days", "five hours",
+  # "11:30", "15:45:11", "one day", etc.
+  #
+  # Throws:: RunTimeError "invalid time string" on parse failure
+  def timestr_offset(timestr)
+    case timestr
+      when (/^(\S+)\s+(\S+)$/)
+        mult = $1
+        unit = $2
+        if(mult =~ /^([\d.]+)$/)
+          num = $1.to_f
+          raise "invalid time string" unless num
+        else
+          case mult
+            when(/^(one|an|a)$/)
+              num = 1
+            when(/^two$/)
+              num = 2
+            when(/^three$/)
+              num = 3
+            when(/^four$/)
+              num = 4
+            when(/^five$/)
+              num = 5
+            when(/^six$/)
+              num = 6
+            when(/^seven$/)
+              num = 7
+            when(/^eight$/)
+              num = 8
+            when(/^nine$/)
+              num = 9
+            when(/^ten$/)
+              num = 10
+            when(/^fifteen$/)
+              num = 15
+            when(/^twenty$/)
+              num = 20
+            when(/^thirty$/)
+              num = 30
+            when(/^sixty$/)
+              num = 60
+            else
+              raise "invalid time string"
+          end
+        end
+        case unit
+          when (/^(s|sec(ond)?s?)$/)
+            return num
+          when (/^(m|min(ute)?s?)$/)
+            return num * 60
+          when (/^(h|h(ou)?rs?)$/)
+            return num * 60 * 60
+          when (/^(d|days?)$/)
+            return num * 60 * 60 * 24
+          else
+            raise "invalid time string"
+        end
+      when (/^(\d+):(\d+):(\d+)$/)
+        hour = $1.to_i
+        min = $2.to_i
+        sec = $3.to_i
+        now = Time.now
+        later = Time.mktime(now.year, now.month, now.day, hour, min, sec)
+        return later - now
+      when (/^(\d+):(\d+)$/)
+        hour = $1.to_i
+        min = $2.to_i
+        now = Time.now
+        later = Time.mktime(now.year, now.month, now.day, hour, min, now.sec)
+        return later - now
+      when (/^(\d+):(\d+)(am|pm)$/)
+        hour = $1.to_i
+        min = $2.to_i
+        ampm = $3
+        if ampm == "pm"
+          hour += 12
+        end
+        now = Time.now
+        later = Time.mktime(now.year, now.month, now.day, hour, min, now.sec)
+        return later - now
+      when (/^(\S+)$/)
+        num = 1
+        unit = $1
+        case unit
+          when (/^(s|sec(ond)?s?)$/)
+            return num
+          when (/^(m|min(ute)?s?)$/)
+            return num * 60
+          when (/^(h|h(ou)?rs?)$/)
+            return num * 60 * 60
+          when (/^(d|days?)$/)
+            return num * 60 * 60 * 24
+          else
+            raise "invalid time string"
+        end
+      else
+        raise "invalid time string"
+    end
+  end
+
   def initialize
     super
     @reminders = Hash.new
@@ -14,15 +116,11 @@ class RemindPlugin < Plugin
     @reminders.clear
   end
   def help(plugin, topic="")
-    if(plugin =~ /^remind\+$/)
-      "see remind. remind+ can be used to remind someone else of something, using <nick> instead of 'me'. However this will generally require a higher auth level than remind."
-    else
-      "remind me [about] <message> in <time>, remind me [about] <message> every <time>, remind me [about] <message> at <time>, remind me no more [about] <message>, remind me no more"
-    end
+    "reminder plugin: remind <who> [about] <message> in <time>, remind <who> [about] <message> every <time>, remind <who> [about] <message> at <time>, remind <who> no more [about] <message>, remind <who> no more. Generally <who> should be 'me', but you can remind others (nick or channel) if you have remind_others auth"
   end
   def add_reminder(who, subject, timestr, repeat=false)
     begin
-      period = Irc::Utils.timestr_offset(timestr)
+      period = timestr_offset(timestr)
     rescue RuntimeError
       return "couldn't parse that time string (#{timestr}) :("
     end
@@ -58,6 +156,9 @@ class RemindPlugin < Plugin
       if(@reminders.has_key?(who) && @reminders[who].has_key?(subject))
         @bot.timer.remove(@reminders[who][subject])
         @reminders[who].delete(subject)
+        return true
+      else
+        return false
       end
     else
       if(@reminders.has_key?(who))
@@ -65,90 +166,63 @@ class RemindPlugin < Plugin
           @bot.timer.remove(v)
         }
         @reminders.delete(who)
+        return true
+      else
+        return false
       end
     end
   end
-  def privmsg(m)
-
-    if(m.params =~ /^(\S+)\s+(?:about\s+)?(.*)\s+in\s+(.*)$/)
-      who = $1
-      subject = $2
-      period = $3
-      if(who =~ /^me$/)
-        who = m.sourcenick
-      else
-        unless(m.plugin =~ /^remind\+$/)
-          m.reply "incorrect usage: use remind+ to remind persons other than yourself"
-          return
-        end
-      end
+  def remind(m, params)
+    who = params.has_key?(:who) ? params[:who] : m.sourcenick
+    string = params[:string].to_s
+    puts "in remind, string is: #{string}"
+    if(string =~ /^(.*)\s+in\s+(.*)$/)
+      subject = $1
+      period = $2
       if(err = add_reminder(who, subject, period))
         m.reply "incorrect usage: " + err
         return
       end
-    elsif(m.params =~ /^(\S+)\s+(?:about\s+)?(.*)\s+every\s+(.*)$/)
-      who = $1
-      subject = $2
-      period = $3
-      if(who =~ /^me$/)
-        who = m.sourcenick
-      else
-        unless(m.plugin =~ /^remind\+$/)
-          m.reply "incorrect usage: use remind+ to remind persons other than yourself"
-          return
-        end
-      end
+    elsif(string =~ /^(.*)\s+every\s+(.*)$/)
+      subject = $1
+      period = $2
       if(err = add_reminder(who, subject, period, true))
         m.reply "incorrect usage: " + err
         return
       end
-    elsif(m.params =~ /^(\S+)\s+(?:about\s+)?(.*)\s+at\s+(.*)$/)
-      who = $1
-      subject = $2
-      time = $3
-      if(who =~ /^me$/)
-        who = m.sourcenick
-      else
-        unless(m.plugin =~ /^remind\+$/)
-          m.reply "incorrect usage: use remind+ to remind persons other than yourself"
-          return
-        end
-      end
+    elsif(string =~ /^(.*)\s+at\s+(.*)$/)
+      subject = $1
+      time = $2
       if(err = add_reminder(who, subject, time))
         m.reply "incorrect usage: " + err
         return
       end
-    elsif(m.params =~ /^(\S+)\s+no\s+more\s+(?:about\s+)?(.*)$/)
-      who = $1
-      subject = $2
-      if(who =~ /^me$/)
-        who = m.sourcenick
-      else
-        unless(m.plugin =~ /^remind\+$/)
-          m.reply "incorrect usage: use remind+ to remind persons other than yourself"
-          return
-        end
-      end
-      del_reminder(who, subject)
-    elsif(m.params =~ /^(\S+)\s+no\s+more$/)
-      who = $1
-      if(who =~ /^me$/)
-        who = m.sourcenick
-      else
-        unless(m.plugin =~ /^remind\+$/)
-          m.reply "incorrect usage: use remind+ to remind persons other than yourself"
-          return
-        end
-      end
-      del_reminder(who)
     else
-      m.reply "incorrect usage: " + help(m.plugin)
+      usage(m)
       return
     end
     m.okay
   end
+  def no_more(m, params)
+    who = params.has_key?(:who) ? params[:who] : m.sourcenick
+    deleted = params.has_key?(:string) ? 
+              del_reminder(who, params[:string].to_s) : del_reminder(who)
+    if deleted
+      m.okay
+    else 
+      m.reply "but I wasn't going to :/"
+    end
+  end
 end
 plugin = RemindPlugin.new
-plugin.register("remind")
-plugin.register("remind+")
+plugin.map 'remind me no more', :action => 'no_more'
+plugin.map 'remind me no more about *string', :action => 'no_more'
+plugin.map 'remind me no more *string', :action => 'no_more'
+plugin.map 'remind me about *string'
+plugin.map 'remind me *string'
+plugin.map 'remind :who no more', :auth => 'remind_other', :action => 'no_more'
+plugin.map 'remind :who no more about *string', :auth => 'remind_other', :action => 'no_more'
+plugin.map 'remind :who no more *string', :auth => 'remind_other', :action => 'no_more'
+plugin.map 'remind :who about *string', :auth => 'remind_other'
+plugin.map 'remind :who *string', :auth => 'remind_other'