summaryrefslogtreecommitdiff
path: root/data/rbot/plugins/remind.rb
diff options
context:
space:
mode:
authorTom Gilbert <tom@linuxbrit.co.uk>2005-07-29 13:44:33 +0000
committerTom Gilbert <tom@linuxbrit.co.uk>2005-07-29 13:44:33 +0000
commit676dd61e6b0bea5f506d064039a685944aefd6fb (patch)
tree60fa1936a11a67d6412f9db28532d623aabed5d1 /data/rbot/plugins/remind.rb
parent438d56ceb82755961229d222d82a1c22ce04ab1d (diff)
Fri Jul 29 13:07:56 BST 2005 Tom Gilbert <tom@linuxbrit.co.uk>
* Moved some stuff out of util.rb into the plugins that actually need them. Those methods didn't belong in util as they were plugin-specific. * moved a few more plugins to use map() where appropriate * made the url plugin only store unique urls
Diffstat (limited to 'data/rbot/plugins/remind.rb')
-rw-r--r--data/rbot/plugins/remind.rb214
1 files changed, 144 insertions, 70 deletions
diff --git a/data/rbot/plugins/remind.rb b/data/rbot/plugins/remind.rb
index 5ad980ae..f66c4fc8 100644
--- a/data/rbot/plugins/remind.rb
+++ b/data/rbot/plugins/remind.rb
@@ -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'