· 8 years ago · Mar 05, 2018, 06:36 PM
1"""Threaded reminder plugin."""
2import datetime
3import threading
4import time
5
6from minitaur.callbacks import InvalidArgsError, Plugin, require_args
7
8
9class Remind(Plugin):
10
11 def initialize(self):
12 self.reminders = []
13 self.register_public(self.remember, ('rmd', 'remind'),
14 ('d:t:l', ['days=', 'time=', 'list']))
15
16 def add_reminder(self, seconds, text, event):
17 self.reminders.append((seconds, text, datetime.datetime.now(), event))
18 threading.Timer(seconds, self.remind,
19 (len(self.reminders) - 1,)).start()
20 self.respond('Added reminder. You will be reminded in %d '
21 'seconds.' % seconds)
22
23 @require_args
24 def remember(self, event, opts, args):
25 """Reminds you to do stuff. Time can be given in minutes HH:MM."""
26 t = None
27 d = None
28 n = datetime.datetime.now()
29 if not opts:
30 raise InvalidArgsError('You must specify a time!')
31 for opt, arg in opts:
32 if opt in ('-l', '--list'):
33 if self.reminders:
34 if args[0].lower() == 'all':
35 rems = self.reminders
36 else:
37 try:
38 rems = [self.reminders[int(a)] for a in args]
39 except ValueError:
40 rems = [self.reminders[int(i)] for a in args
41 for i in a.split('-')]
42 for i, r in enumerate(rems):
43 remaining = (datetime.datetime.now() - r[2]).seconds
44 if (r[0] - remaining < 60):
45 remaining = str(r[0] - remaining) + 's'
46 else:
47 remaining = str((r[0] - remaining)/60) + 'm'
48 self.respond(' %s | %s | %s' % (
49 str(i).rjust(len(rems)),
50 remaining.ljust(9), r[3].nick))
51 time.sleep(1)
52 else:
53 self.respond('No reminders to list.')
54 return
55 elif opt in ('-d', '--days'):
56 d = int(arg)
57 elif opt in ('-t', '--time'):
58 try:
59 t = float(arg)
60 # 365 * 24 * 60 * 60 = 31536000 seconds
61 if t >= 31536000:
62 raise InvalidArgsError('Sorry, there is little'
63 ' guarantee that I\'ll be alive that long.')
64 seconds = int(t * 60)
65 except ValueError:
66 if arg.find(':') == -1:
67 raise InvalidArgsError('Time must be an integer or'
68 '24hr representational string.')
69 t = datetime.datetime(n.year, n.month, n.day,
70 *map(int, arg.split(':')[:2])) - n
71 if (t.days < 0):
72 if d:
73 seconds = (datetime.datetime(n.year, n.month,
74 n.day + d, *map(int, arg.split(':')[:2])) - n)\
75 .seconds
76 else:
77 raise InvalidArgsError('You must specify a day '
78 'offset (-d|--days) for times <= current!')
79 elif (t.days == 0):
80 seconds = t.seconds
81 else:
82 raise InvalidArgsError('Invalid time')
83
84 self.add_reminder(seconds, args[0], event)
85
86
87 def remind(self, index):
88 i = self.reminders.pop(index)
89 if self.bot.channels[i[3].target()].has_user(i[3].nick):
90 self.connection.privmsg(i[3].target(),
91 '%s: [remind] %s' % (i[3].nick, i[1]))
92
93
94META = {
95 'author': 'mini-man',
96 'email': 'mini.mcmidget AT gmail.com'
97}