forked from github/hubot-scripts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
remind.coffee
82 lines (69 loc) · 2.48 KB
/
remind.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# Forgetful? Add reminders.
#
# remind me in <time> to <action> - Set a reminder in <time> to do an <action>
# <time> is in the format 1 day, 2 hours, 5 minutes etc
# Time segments are optional, as are commas
class Reminders
constructor: (@robot) ->
@cache = []
@current_timeout = null
@robot.brain.on 'loaded', =>
if @robot.brain.data.reminders
@cache = @robot.brain.data.reminders
@queue()
add: (reminder) ->
@cache.push reminder
@cache.sort (a, b) -> a.due - b.due
@robot.brain.data.reminders = @cache
@queue()
removeFirst: ->
reminder = @cache.shift()
@robot.brain.data.reminders = @cache
return reminder
queue: ->
clearTimeout @current_timeout if @current_timeout
if @cache.length > 0
now = new Date().getTime()
@removeFirst() until @cache.length is 0 or @cache[0].due > now
if @cache.length > 0
trigger = =>
reminder = @removeFirst()
@robot.send reminder.for, reminder.for.name + ', you asked me to remind you to ' + reminder.action
@queue()
@current_timeout = setTimeout trigger, @cache[0].due - now
class Reminder
constructor: (@for, @time, @action) ->
@time.replace(/^\s+|\s+$/g, '')
periods =
weeks:
value: 0
regex: "weeks?"
days:
value: 0
regex: "days?"
hours:
value: 0
regex: "hours?|hrs?"
minutes:
value: 0
regex: "minutes?|mins?"
seconds:
value: 0
regex: "seconds?|secs?"
for period of periods
pattern = new RegExp('^.*?([\\d\\.]+)\\s*(?:(?:' + periods[period].regex + ')).*$', 'i')
matches = pattern.exec(@time)
periods[period].value = parseInt(matches[1]) if matches
@due = new Date().getTime()
@due += ((periods.weeks.value * 604800) + (periods.days.value * 86400) + (periods.hours.value * 3600) + (periods.minutes.value * 60) + periods.seconds.value) * 1000
dueDate: ->
dueDate = new Date @due
dueDate.toLocaleString()
module.exports = (robot) ->
reminders = new Reminders robot
robot.respond /remind me in ((?:(?:\d+) (?:weeks?|days?|hours?|hrs?|minutes?|mins?|seconds?|secs?)[ ,]*(?:and)? +)+)to (.*)/i, (msg) ->
time = msg.match[1]
action = msg.match[2]
reminder = new Reminder msg.message.user, time, action
reminders.add reminder
msg.send 'I\'ll remind you to ' + action + ' on ' + reminder.dueDate()