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) # if the given hour is earlier than current hour, given timestr # must have been meant to be in the future if hour < now.hour || hour <= now.hour && min < now.min later += 60*60*24 end 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 end def cleanup @reminders.each_value {|v| v.each_value {|vv| @bot.timer.remove(vv) } } @reminders.clear super end def help(plugin, topic="") "reminder plugin: remind [about] in