diff options
author | Tom Gilbert <tom@linuxbrit.co.uk> | 2005-07-29 13:44:33 +0000 |
---|---|---|
committer | Tom Gilbert <tom@linuxbrit.co.uk> | 2005-07-29 13:44:33 +0000 |
commit | 676dd61e6b0bea5f506d064039a685944aefd6fb (patch) | |
tree | 60fa1936a11a67d6412f9db28532d623aabed5d1 /data/rbot/plugins/remind.rb | |
parent | 438d56ceb82755961229d222d82a1c22ce04ab1d (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.rb | 214 |
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' |