~ubuntu-branches/ubuntu/utopic/gozerbot/utopic

« back to all changes in this revision

Viewing changes to gozerplugs/plugs/todo.py

  • Committer: Bazaar Package Importer
  • Author(s): Jeremy Malcolm
  • Date: 2009-09-14 09:00:29 UTC
  • mfrom: (1.1.4 upstream) (3.1.5 sid)
  • Revision ID: james.westby@ubuntu.com-20090914090029-uval0ekt72kmklxw
Tags: 0.9.1.3-3
Changed dependency on python-setuptools to python-pkg-resources
(Closes: #546435) 

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# plugs/todo.py
2
 
#
3
 
#
4
 
 
5
 
""" manage todo lists .. by user or by channel .. a time/data string can 
6
 
 be provided to set time on a todo item.
7
 
"""
8
 
 
9
 
__copyright__ = 'this file is in the public domain'
10
 
 
11
 
from gozerbot.generic import strtotime, striptime, getwho, today, lockdec
12
 
from gozerbot.commands import cmnds
13
 
from gozerbot.examples import examples
14
 
from gozerbot.users import users
15
 
from gozerbot.datadir import datadir
16
 
from gozerbot.persist import Persist
17
 
from gozerbot.plughelp import plughelp
18
 
from gozerbot.aliases import aliases
19
 
from gozerbot.config import config
20
 
from gozerplugs.plugs.alarm import alarms
21
 
import time, thread, os
22
 
 
23
 
plughelp.add('todo', 'todo lists')
24
 
 
25
 
todolock = thread.allocate_lock()
26
 
locked = lockdec(todolock)
27
 
 
28
 
class Todoitem:
29
 
 
30
 
    """ a todo item """
31
 
 
32
 
    def __init__(self, name, descr, ttime=None, duration=None, warnsec=None, \
33
 
priority=None, num=0):
34
 
        self.name = name
35
 
        self.time = ttime
36
 
        self.duration = duration
37
 
        self.warnsec = warnsec
38
 
        self.descr = descr
39
 
        self.priority = priority
40
 
        self.num = num
41
 
 
42
 
    def __str__(self):
43
 
        return "name: %s num: %d time: %s duration: %s warnsec: %s \
44
 
description: %s priority: %s" % (self.name, self.num, \
45
 
time.ctime(self.time), self.duration, self.warnsec, self.descr, self.priority)
46
 
 
47
 
class Todolist:
48
 
 
49
 
    """ a dict faking list of todo items .. index is number """
50
 
 
51
 
    def __init__(self):
52
 
        self.max = 0
53
 
        self.data = {}
54
 
 
55
 
    def __len__(self):
56
 
        return len(self.data)
57
 
 
58
 
    def __getitem__(self, num):
59
 
        return self.data[num]
60
 
 
61
 
    def __delitem__(self, num):
62
 
        del self.data[num]
63
 
 
64
 
    def __iter__(self):
65
 
        tmplist = self.data.values()
66
 
        tmplist.sort(lambda x, y: cmp(x.priority, y.priority), reverse=True)
67
 
        return tmplist.__iter__()
68
 
 
69
 
    def append(self, item):
70
 
        """ add todo item """
71
 
        self.max += 1
72
 
        item.num = self.max
73
 
        self.data[self.max] = item
74
 
 
75
 
    def __str__(self):
76
 
        return str(self.data)
77
 
 
78
 
 
79
 
class Todo(Persist):
80
 
 
81
 
    """ Todoos """
82
 
 
83
 
    @locked
84
 
    def __init__(self, filename):
85
 
        Persist.__init__(self, filename)
86
 
        if not self.data:
87
 
            return
88
 
        for key in self.data.keys():
89
 
            todoos = self.data[key]
90
 
            for (k, v) in todoos.data.items():
91
 
                v.num = k
92
 
            newd = Todolist()
93
 
            for i in todoos:
94
 
                newd.append(i)
95
 
            self.data[key] = newd
96
 
 
97
 
    def size(self):
98
 
        """ return number of todo entries """
99
 
        return len(self.data)
100
 
 
101
 
    def get(self, name):
102
 
        """ get todoos of <name> """
103
 
        if self.data.has_key(name):
104
 
            return self.data[name]
105
 
 
106
 
    @locked
107
 
    def add(self, name, txt, ttime, warnsec=0):
108
 
        """ add a todo """
109
 
        name = name.lower()
110
 
        if not self.data.has_key(name):
111
 
            self.data[name] = Todolist()
112
 
        self.data[name].append(Todoitem(name, txt.strip(), ttime, \
113
 
warnsec=0-warnsec))
114
 
        self.save()
115
 
        return len(self.data[name])
116
 
 
117
 
    @locked
118
 
    def addnosave(self, name, txt, ttime):
119
 
        """ add but don't save """
120
 
        name = name.lower()
121
 
        if not self.data.has_key(name):
122
 
            self.data[name] = Todolist()
123
 
        self.data[name].append(Todoitem(name, txt, ttime))
124
 
 
125
 
 
126
 
    @locked
127
 
    def reset(self, name):
128
 
        name = name.lower()
129
 
        if self.data.has_key(name):
130
 
           self.data[name] = Todolist()
131
 
        self.save()
132
 
 
133
 
    @locked
134
 
    def delete(self, name, nr):
135
 
        """ delete todo item """
136
 
        if not self.data.has_key(name):
137
 
            return 0
138
 
        todoos = self.data[name]
139
 
        try:
140
 
            if todoos[nr].warnsec:
141
 
                alarmnr = 0 - todoos[nr].warnsec
142
 
                if alarmnr > 0:
143
 
                    alarms.delete(alarmnr)
144
 
            del todoos[nr]
145
 
        except KeyError:
146
 
            return 0
147
 
        self.save()
148
 
        return 1
149
 
 
150
 
    def toolate(self, name):
151
 
        """ show if there are any time related todoos that are too late """
152
 
        now = time.time()
153
 
        teller = 0
154
 
        for i in self.data[name]:
155
 
            if i.time < now:
156
 
                teller += 1
157
 
        return teller
158
 
 
159
 
    def timetodo(self, name):
160
 
        """ show todoos with time field set """
161
 
        result = []
162
 
        if not self.data.has_key(name):
163
 
            return result
164
 
        for i in self.data[name]:
165
 
            if i.time:
166
 
                result.append(i)
167
 
        return result
168
 
 
169
 
    def withintime(self, name, time1, time2):
170
 
        """ show todoos within time frame """
171
 
        result = []
172
 
        if not self.data.has_key(name):
173
 
            return result
174
 
        for i in self.data[name]:
175
 
            if i.time >= time1 and i.time < time2:
176
 
                result.append(i)
177
 
        return result
178
 
 
179
 
    @locked
180
 
    def setprio(self, who, itemnr, prio):
181
 
        """ set priority of todo item """
182
 
        try:
183
 
            todoitems = self.get(who)
184
 
            todoitems[itemnr].priority = prio
185
 
            self.save()
186
 
            return 1
187
 
        except (KeyError, TypeError):
188
 
            pass
189
 
 
190
 
    def settime(self, who, itemnr, ttime):
191
 
        """ set time of todo item """
192
 
        try:
193
 
            todoitems = self.get(who)
194
 
            todoitems[itemnr].time = ttime
195
 
            self.save()
196
 
            return 1
197
 
        except (KeyError, TypeError):
198
 
            pass
199
 
 
200
 
class TodoDb(object):
201
 
 
202
 
    """ database todo interface """
203
 
 
204
 
    def reset(self, name): 
205
 
        result = db.execute(""" DELETE FROM todo WHERE name == %s """, name)
206
 
        return result
207
 
 
208
 
    def size(self):
209
 
        """ return number of todo's """
210
 
        result = db.execute(""" SELECT COUNT(*) FROM todo """)
211
 
        return result[0][0]
212
 
        
213
 
    def get(self, name):
214
 
        """ get todo list of <name> """
215
 
        name = name.lower()
216
 
        result = db.execute(""" SELECT * FROM todo WHERE name = %s ORDER BY \
217
 
priority DESC, indx ASC """, name)
218
 
        res = []
219
 
        if result:
220
 
            for i in result:
221
 
                args = [i[1],i[5], i[2], i[3], i[4], i[6], i[0]]
222
 
                res.append(Todoitem(*args))
223
 
        return res
224
 
 
225
 
    def getid(self, idnr):
226
 
        """ get todo data of <idnr> """
227
 
        result = db.execute(""" SELECT * FROM todo WHERE indx = %s """, idnr)
228
 
        res = []
229
 
        if result:
230
 
            for i in result:
231
 
                args = [i[1],i[5], i[2], i[3], i[4], i[6], i[0]]
232
 
                res.append(Todoitem(*args))
233
 
        return res
234
 
        return result
235
 
 
236
 
    def setprio(self, who, todonr, prio):
237
 
        """ set priority of todonr """
238
 
        result = db.execute(""" UPDATE todo SET priority = %s WHERE indx \
239
 
= %s """, (prio, todonr))
240
 
        return result
241
 
 
242
 
    def getprio(self, todonr):
243
 
        """ get priority of todonr """
244
 
        result = db.execute(""" SELECT name, priority FROM todo WHERE \
245
 
indx = %s """, todonr)
246
 
        return result
247
 
 
248
 
    def getwarnsec(self, todonr):
249
 
        """ get priority of todonr """
250
 
        result = db.execute(""" SELECT warnsec FROM todo WHERE \
251
 
indx = %s """, todonr)
252
 
        return result
253
 
 
254
 
    def settime(self, who, todonr, ttime):
255
 
        """ set time of todonr """
256
 
        result = db.execute(""" UPDATE todo SET time = %s WHERE indx \
257
 
= %s """, (ttime, todonr))
258
 
        return result
259
 
 
260
 
    def add(self, name, txt, ttime, alarmnr=None):
261
 
        """ add a todo """
262
 
        name = name.lower()
263
 
        txt = txt.strip()
264
 
        if ttime:
265
 
            if not alarmnr:
266
 
                result = db.execute(""" INSERT INTO todo(name, time, \
267
 
descr) VALUES (%s, %s, %s) """, (name, ttime, txt))
268
 
            else:
269
 
                result = db.execute(""" INSERT INTO todo(name, time, \
270
 
descr, warnsec) VALUES (%s, %s, %s, %s) """, (name, ttime, txt, 0-alarmnr))
271
 
 
272
 
        else:
273
 
            result = db.execute(""" INSERT INTO todo(name, descr) \
274
 
VALUES (%s, %s) """, (name, txt))
275
 
        return result
276
 
 
277
 
    def delete(self, name, indexnr):
278
 
        """ delete todo item """
279
 
        name = name.lower()
280
 
        try:
281
 
            warnsec = self.getwarnsec(indexnr)[0][0]
282
 
            if warnsec:
283
 
                alarmnr = 0 - warnsec
284
 
                if alarmnr > 0:
285
 
                    alarms.delete(alarmnr)
286
 
        except (IndexError, TypeError):
287
 
            pass
288
 
        result = db.execute(""" DELETE FROM todo WHERE name = %s AND \
289
 
indx = %s """, (name, indexnr))
290
 
        return result
291
 
 
292
 
    def toolate(self, name):
293
 
        """ show if there are any time related todoos that are too late """
294
 
        name = name.lower()
295
 
        now = time.time()
296
 
        result = db.execute(""" SELECT * FROM todo WHERE name = %s AND \
297
 
time < %s """, (name, now))
298
 
        res = []
299
 
        if result:
300
 
            for i in result:
301
 
                args = [i[1],i[5], i[2], i[3], i[4], i[6], i[0]]
302
 
                res.append(Todoitem(*args))
303
 
        return res
304
 
 
305
 
    def withintime(self, name, time1, time2):
306
 
        """ show todo list within time frame """
307
 
        name = name.lower()
308
 
        result = db.execute(""" SELECT * FROM todo WHERE name = %s AND \
309
 
time > %s AND time < %s """, (name, time1, time2))
310
 
        res = []
311
 
        if result:
312
 
            for i in result:
313
 
                args = [i[1],i[5], i[2], i[3], i[4], i[6], i[0]]
314
 
                res.append(Todoitem(*args))
315
 
        return res
316
 
 
317
 
    def timetodo(self, name):
318
 
        name = name.lower()
319
 
        now = time.time()
320
 
        result = db.execute(""" SELECT * FROM todo WHERE time AND name = %s \
321
 
""", name)
322
 
        res = []
323
 
        if result:
324
 
            for i in result:
325
 
                args = [i[1],i[5], i[2], i[3], i[4], i[6], i[0]]
326
 
                res.append(Todoitem(*args))
327
 
        return res
328
 
 
329
 
    def reset(self, name):
330
 
        """ reset todo items of user with <name> """
331
 
        name = name.lower()
332
 
        result = db.execute(""" DELETE FROM todo WHERE name = %s """, (name, ))
333
 
        return result
334
 
 
335
 
if config['dbenable']:
336
 
    from gozerbot.db import db
337
 
    todo = TodoDb()
338
 
else:
339
 
    todo = Todo(datadir + os.sep + 'todo')
340
 
    if not todo.data:
341
 
        todo.data = {}
342
 
 
343
 
def size():
344
 
    """ return number of todo entries """
345
 
    return todo.size()
346
 
 
347
 
def handle_todo(bot, ievent):
348
 
    """ todo [<item>] .. show todo's or set todo item .. a time/date can be \
349
 
given"""
350
 
    if len(ievent.args) > 0:
351
 
        handle_todo2(bot, ievent)
352
 
        return
353
 
    name = users.getname(ievent.userhost)
354
 
    try:
355
 
        todoos = todo.get(name)
356
 
    except KeyError:
357
 
        ievent.reply('i dont have todo info for %s' % user.name)
358
 
        return
359
 
    saytodo(bot, ievent, todoos)
360
 
 
361
 
def handle_todo2(bot, ievent):
362
 
    """ set todo item """
363
 
    if not ievent.rest:
364
 
        ievent.missing("<what>")
365
 
        return
366
 
    else:
367
 
        what = ievent.rest
368
 
    name = users.getname(ievent.userhost)
369
 
    ttime = strtotime(what)
370
 
    nr = 0
371
 
    if not ttime  == None:
372
 
        ievent.reply('time detected ' + time.ctime(ttime))
373
 
        what = striptime(what)
374
 
        alarmnr = alarms.add(bot.name, ievent.nick, ttime, what)
375
 
        nr = todo.add(name, what, ttime, alarmnr)
376
 
    else:
377
 
        nr = todo.add(name, what, None)
378
 
    ievent.reply('todo item %s added' % nr)
379
 
 
380
 
cmnds.add('todo', handle_todo, 'USER')
381
 
examples.add('todo', 'todo [<item>] .. show todo items or add a todo item', \
382
 
'1) todo 2) todo program the bot 3) todo 22:00 sleep')
383
 
 
384
 
def handle_tododone(bot, ievent):
385
 
    """ todo-done <listofnrs> .. remove todo items """
386
 
    if len(ievent.args) == 0:
387
 
        ievent.missing('<list of nrs>')
388
 
        return
389
 
    try:
390
 
        nrs = []
391
 
        for i in ievent.args:
392
 
            nrs.append(int(i))
393
 
    except ValueError:
394
 
        ievent.reply('%s is not an integer' % i)
395
 
        return
396
 
    name = users.getname(ievent.userhost)
397
 
    nrdone = 0
398
 
    for i in nrs:
399
 
        nrdone += todo.delete(name, i)
400
 
    if nrdone == 1:
401
 
        ievent.reply('%s item deleted' % nrdone)
402
 
    elif nrdone == 0:
403
 
        ievent.reply('no items deleted')
404
 
    else:
405
 
        ievent.reply('%s items deleted' % nrdone)
406
 
 
407
 
cmnds.add('todo-done', handle_tododone, 'USER')
408
 
examples.add('todo-done', 'todo-done <listofnrs> .. remove items from \
409
 
todo list', '1) todo-done 1 2) todo-done 3 5 8')
410
 
aliases.data['done'] = 'todo-done'
411
 
 
412
 
def handle_chantodo(bot, ievent):
413
 
    """ todo-chan [<item>] .. show channel todo's or set todo item for \
414
 
channel"""
415
 
    if ievent.rest:
416
 
        handle_chantodo2(bot, ievent)
417
 
        return
418
 
    todoos = todo.get(ievent.channel)
419
 
    saytodo(bot, ievent, todoos)
420
 
 
421
 
def handle_chantodo2(bot, ievent):
422
 
    """ set todo item for channel"""
423
 
    what = ievent.rest
424
 
    ttime = strtotime(what)
425
 
    nr = 0
426
 
    if not ttime  == None:
427
 
        ievent.reply('time detected ' + time.ctime(ttime))
428
 
        result = '(%s) ' % ievent.nick + striptime(what)
429
 
        alarmnr = alarms.add(bot.name, ievent.channel, ttime, result)
430
 
        nr = todo.add(ievent.channel, result, ttime, alarmnr)
431
 
    else:
432
 
        result = '(%s) ' % ievent.nick + what
433
 
        nr = todo.add(ievent.channel, result, None)
434
 
    ievent.reply('todo item %s added' % nr)
435
 
 
436
 
cmnds.add('todo-chan', handle_chantodo, 'USER')
437
 
examples.add('todo-chan', 'todo-chan [<item>] .. add channel todo', \
438
 
'todo-chan fix bla')
439
 
aliases.data['chantodo'] = 'todo-chan'
440
 
 
441
 
def handle_todochandone(bot, ievent):
442
 
    """ todo-chandone <listofnrs> .. remove channel todo item """
443
 
    if not ievent.rest:
444
 
        ievent.missing('<list of nrs>')
445
 
        return
446
 
    data = ievent.rest.split()
447
 
    try:
448
 
        nrs = []
449
 
        for i in data:
450
 
            nrs.append(int(i))
451
 
    except ValueError:
452
 
        ievent.reply('%s is not an integer' % i)
453
 
        return
454
 
    nrdone = 0
455
 
    for i in nrs:
456
 
        nrdone += todo.delete(ievent.channel, i)
457
 
    if nrdone == 1:
458
 
        ievent.reply('%s item deleted' % nrdone)
459
 
    elif nrdone == 0:
460
 
        ievent.reply('no items deleted')
461
 
    else:
462
 
        ievent.reply('%s items deleted' % nrdone)
463
 
 
464
 
cmnds.add('todo-chandone', handle_todochandone, 'USER')
465
 
examples.add('todo-chandone', 'todo-chandone <listofnrs> .. remove item \
466
 
from channel todo list', 'todo-chandone 2')
467
 
aliases.data['chandone'] = 'todo-chandone'
468
 
 
469
 
def handle_settodo(bot, ievent):
470
 
    """ todo-set <name> <txt> .. add a todo to another user's todo list"""
471
 
    try:
472
 
        who = ievent.args[0]
473
 
        what = ' '.join(ievent.args[1:])
474
 
    except IndexError:
475
 
        ievent.missing('<nick> <what>')
476
 
        return
477
 
    if not what:
478
 
        ievent.missing('<nick> <what>')
479
 
        return
480
 
    userhost = getwho(bot, who)
481
 
    if not userhost:
482
 
        ievent.reply("can't find userhost for %s" % who)
483
 
        return
484
 
    whouser = users.getname(userhost)
485
 
    if not whouser:
486
 
        ievent.reply("can't find user for %s" % userhost)
487
 
        return
488
 
    name = users.getname(ievent.userhost)
489
 
    if not users.permitted(userhost, name, 'todo'):
490
 
        ievent.reply("%s doesn't permit todo sharing for %s " % \
491
 
(who, name))
492
 
        return
493
 
    what = "%s: %s" % (ievent.nick, what)
494
 
    ttime = strtotime(what)
495
 
    nr = 0
496
 
    if not ttime  == None:
497
 
        ievent.reply('time detected ' + time.ctime(ttime))
498
 
        what = striptime(what)
499
 
        alarmnr = alarms.add(bot.name, who, ttime, what)
500
 
        nr = todo.add(whouser, what, ttime, alarmnr)
501
 
    else:
502
 
        nr = todo.add(whouser, what, None)
503
 
    ievent.reply('todo item %s added' % nr)
504
 
 
505
 
cmnds.add('todo-set', handle_settodo, 'USER')
506
 
examples.add('todo-set', 'todo-set <nick> <txt> .. set todo item of \
507
 
<nick>', 'todo-set dunker bot proggen')
508
 
 
509
 
def handle_gettodo(bot, ievent):
510
 
    """ todo-get <nick> .. get todo of another user """
511
 
    try:
512
 
        who = ievent.args[0]
513
 
    except IndexError:
514
 
        ievent.missing('<nick>')
515
 
        return
516
 
    userhost = getwho(bot, who)
517
 
    if not userhost:
518
 
        ievent.reply("can't find userhost for %s" % who)
519
 
        return
520
 
    whouser = users.getname(userhost)
521
 
    if not whouser:
522
 
        ievent.reply("can't find user for %s" % userhost)
523
 
        return
524
 
    name = users.getname(ievent.userhost)
525
 
    if not users.permitted(userhost, name, 'todo'):
526
 
        ievent.reply("%s doesn't permit todo sharing for %s " % (who, name))
527
 
        return
528
 
    todoos = todo.get(whouser)
529
 
    saytodo(bot, ievent, todoos)
530
 
 
531
 
cmnds.add('todo-get', handle_gettodo, ['USER', 'WEB'])
532
 
examples.add('todo-get', 'todo-get <nick> .. get the todo list of \
533
 
<nick>', 'todo-get dunker')
534
 
 
535
 
def handle_todotime(bot, ievent):
536
 
    """ todo-time .. show time related todoos """
537
 
    name = users.getname(ievent.userhost)
538
 
    todoos = todo.timetodo(name)
539
 
    saytodo(bot, ievent, todoos)
540
 
 
541
 
cmnds.add('todo-time', handle_todotime, 'USER')
542
 
examples.add('todo-time', 'todo-time .. show todo items with time fields', \
543
 
'todo-time')
544
 
aliases.data['tt'] = 'todo-time'
545
 
 
546
 
def handle_todoweek(bot, ievent):
547
 
    """ todo-week .. show time related todo items for this week """
548
 
    name = users.getname(ievent.userhost)
549
 
    todoos = todo.withintime(name, today(), today()+7*24*60*60)
550
 
    saytodo(bot, ievent, todoos)
551
 
 
552
 
cmnds.add('todo-week', handle_todoweek, 'USER')
553
 
examples.add('todo-week', 'todo-week .. todo items for this week', 'todo-week')
554
 
 
555
 
def handle_today(bot, ievent):
556
 
    """ todo-today .. show time related todo items for today """
557
 
    name = users.getname(ievent.userhost)
558
 
    todoos = todo.withintime(name, today(), today()+24*60*60)
559
 
    saytodo(bot, ievent, todoos)
560
 
 
561
 
cmnds.add('todo-today', handle_today, 'USER')
562
 
examples.add('todo-today', 'todo-today .. todo items for today', 'todo-today')
563
 
aliases.data['today'] = 'todo-today'
564
 
 
565
 
def handle_tomorrow(bot, ievent):
566
 
    """ todo-tomorrow .. show time related todo items for tomorrow """
567
 
    username = users.getname(ievent.userhost)
568
 
    if ievent.rest:
569
 
        what = ievent.rest
570
 
        ttime = strtotime(what)
571
 
        if ttime != None:
572
 
            if ttime < today() or ttime > today() + 24*60*60:
573
 
                ievent.reply("%s is not tomorrow" % \
574
 
time.ctime(ttime + 24*60*60))
575
 
                return
576
 
            ttime += 24*60*60
577
 
            ievent.reply('time detected ' + time.ctime(ttime))
578
 
            what = striptime(what)
579
 
        else:
580
 
            ttime = today() + 42*60*60
581
 
        todo.add(username, what, ttime)   
582
 
        ievent.reply('todo added')    
583
 
        return
584
 
    todoos = todo.withintime(username, today()+24*60*60, today()+2*24*60*60)
585
 
    saytodo(bot, ievent, todoos)
586
 
 
587
 
cmnds.add('todo-tomorrow', handle_tomorrow, 'USER')
588
 
examples.add('todo-tomorrow', 'todo-tomorrow .. todo items for tomorrow', \
589
 
'todo-tomorrow')
590
 
aliases.data['tomorrow'] = 'todo-tomorrow'
591
 
 
592
 
def handle_setpriority(bot, ievent):
593
 
    """ todo-setprio [<channel|name>] <itemnr> <prio> .. show priority \
594
 
        on todo item """
595
 
    try:
596
 
        (who, itemnr, prio) = ievent.args
597
 
    except ValueError:
598
 
        try:
599
 
            (itemnr, prio) = ievent.args
600
 
            who = users.getname(ievent.userhost)
601
 
        except ValueError:
602
 
            ievent.missing('[<channe|namel>] <itemnr> <priority>')
603
 
            return
604
 
    try:
605
 
        itemnr = int(itemnr)
606
 
        prio = int(prio)
607
 
    except ValueError:
608
 
        ievent.missing('[<channel|name>] <itemnr> <priority>')
609
 
        return
610
 
    who = who.lower()
611
 
    if not todo.setprio(who, itemnr, prio):
612
 
        ievent.reply('no todo %s found for %s' % (itemnr, who))
613
 
        return
614
 
    ievent.reply('priority set')
615
 
 
616
 
cmnds.add('todo-setprio', handle_setpriority, 'USER')
617
 
examples.add('todo-setprio', 'todo-setprio [<channel|name>] <itemnr> <prio> \
618
 
.. set todo priority', '1) todo-setprio #dunkbots 2 5 2) todo-setprio owner \
619
 
3 10 3) todo-setprio 2 10')
620
 
aliases.data['setprio'] = 'todo-setprio'
621
 
 
622
 
def handle_todosettime(bot, ievent):
623
 
    """ todo-settime [<channel|name>] <itemnr> <timestring> .. set time \
624
 
        on todo item """
625
 
    ttime = strtotime(ievent.txt)
626
 
    if ttime == None:
627
 
        ievent.reply("can't detect time")
628
 
        return   
629
 
    txt = striptime(ievent.txt)
630
 
    try:
631
 
        (who, itemnr) = txt.split()
632
 
    except ValueError:
633
 
        try:
634
 
            (itemnr, ) = txt.split()
635
 
            who = users.getname(ievent.userhost)
636
 
        except ValueError:
637
 
            ievent.missing('[<channe|namel>] <itemnr> <timestring>')
638
 
            return
639
 
    try:
640
 
        itemnr = int(itemnr)
641
 
    except ValueError:
642
 
        ievent.missing('[<channel|name>] <itemnr> <timestring>')
643
 
        return
644
 
    who = who.lower()
645
 
    if not todo.settime(who, itemnr, ttime):
646
 
        ievent.reply('no todo %s found for %s' % (itemnr, who))
647
 
        return
648
 
    ievent.reply('time of todo %s set to %s' % (itemnr, time.ctime(ttime)))
649
 
 
650
 
cmnds.add('todo-settime', handle_todosettime, 'USER')
651
 
examples.add('todo-settime', 'todo-settime [<channel|name>] <itemnr> \
652
 
<timestring> .. set todo time', '1) todo-settime #dunkbots 2 13:00 2) \
653
 
todo-settime owner 3 2-2-2010 3) todo-settime 2 22:00')
654
 
 
655
 
def handle_getpriority(bot, ievent):
656
 
    """ todo-getprio <[channel|name]> <itemnr> .. get priority of todo \
657
 
        item """
658
 
    try:
659
 
        (who, itemnr) = ievent.args
660
 
    except ValueError:
661
 
        try:
662
 
            itemnr = ievent.args[0]
663
 
            who = users.getname(ievent.userhost)
664
 
        except IndexError:
665
 
            ievent.missing('[<channel|name>] <itemnr>')
666
 
            return
667
 
    try:
668
 
        itemnr = int(itemnr)
669
 
    except ValueError:
670
 
        ievent.missing('[<channel|name>] <itemnr>')
671
 
        return
672
 
    who = who.lower()
673
 
    todoitems = todo.get(who)
674
 
    if not todoitems:
675
 
        ievent.reply('no todoitems known for %s' % who)
676
 
        return
677
 
    try:
678
 
        prio = todoitems[itemnr].priority
679
 
    except KeyError:
680
 
        ievent.reply('no todo item %s known for %s' % (itemnr, who))
681
 
        return
682
 
    ievent.reply('priority is %s' % prio)
683
 
 
684
 
cmnds.add('todo-getprio', handle_getpriority, 'USER')
685
 
examples.add('todo-getprio', 'todo-getprio [<channel|name>] <itemnr> .. get \
686
 
todo priority', '1) todo-getprio #dunkbots 5 2) todo-getprio 3')
687
 
aliases.data['prio'] = 'todo-getprio'
688
 
 
689
 
def saytodo(bot, ievent, todoos):
690
 
    """ output todo items of <name> """
691
 
    result = []
692
 
    now = time.time()
693
 
    if not todoos:
694
 
        ievent.reply('nothing todo ;]')
695
 
        return
696
 
    for i in todoos:
697
 
        res = ""
698
 
        res += "%s) " % i.num
699
 
        if i.time:
700
 
            if i.time < now:
701
 
                res += 'TOO LATE: '
702
 
            res += "%s %s " % (time.ctime(i.time), i.descr)
703
 
        else:
704
 
            res += "%s " % i.descr
705
 
        if i.priority:
706
 
            res += "[%+d] " % i.priority
707
 
        result.append(res.strip())
708
 
    if result:
709
 
        ievent.reply("todolist of %s: " % ievent.nick, result, nritems=True)