~ubuntu-branches/ubuntu/precise/gozerbot/precise

« back to all changes in this revision

Viewing changes to build/lib/gozerplugs/plugs/alarm.py

  • Committer: Bazaar Package Importer
  • Author(s): Jeremy Malcolm
  • Date: 2008-06-02 19:26:39 UTC
  • mfrom: (1.1.3 upstream) (3.1.1 lenny)
  • Revision ID: james.westby@ubuntu.com-20080602192639-3rn65nx4q1sgd6sy
Tags: 0.8.1-1
New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# plugs/alarm.py
2
 
#
3
 
#
4
 
 
5
 
""" handle txt alarms """
6
 
 
7
 
__copyright__ = 'this file is in the public domain'
8
 
 
9
 
from gozerbot.generic import handle_exception, rlog, strtotime, striptime
10
 
from gozerbot.persist import Persist
11
 
from gozerbot.commands import cmnds
12
 
from gozerbot.examples import examples
13
 
from gozerbot.nextid import nextid
14
 
from gozerbot.fleet import fleet
15
 
from gozerbot.datadir import datadir
16
 
from gozerbot.plughelp import plughelp
17
 
from gozerbot.aliases import aliases
18
 
from gozerbot.periodical import periodical
19
 
import time, os
20
 
 
21
 
plughelp.add('alarm', 'the alarm plugin allows for alarms which /msg the user \
22
 
giving the command at a certain time or at number of seconds from now')
23
 
 
24
 
class Alarmitem(object):
25
 
 
26
 
    """ item holding alarm data """
27
 
 
28
 
    def __init__(self, botname, i, nick, ttime, txt, printto=None):
29
 
        self.botname = botname
30
 
        self.idnr = i
31
 
        self.nick = nick
32
 
        self.time = ttime
33
 
        self.txt = txt
34
 
        self.printto = printto or ""
35
 
 
36
 
    def __str__(self):
37
 
        result = "%s %s %s %s %s" % (self.botname, self.idnr, self.nick, \
38
 
self.time, self.txt)
39
 
        return result
40
 
 
41
 
class Alarms(Persist):
42
 
 
43
 
    """ class that holds the alarms """
44
 
 
45
 
    def __init__(self, fname):
46
 
        Persist.__init__(self, fname)
47
 
        if not self.data:
48
 
            self.data = []
49
 
        for i in self.data:
50
 
            try:
51
 
                getattr(i, 'printto')
52
 
            except AttributeError:
53
 
                setattr(i, 'printto', "")
54
 
            periodical.addjob(i.time - time.time(), 1, self.alarmsay, i.nick, i)
55
 
 
56
 
    def size(self):
57
 
        """ return number of alarms """
58
 
        return len(self.data)
59
 
 
60
 
    def bynick(self, nick):
61
 
        """ get alarms by nick """
62
 
        nick = nick.lower()
63
 
        result = []
64
 
        for i in self.data:
65
 
            if i.nick == nick:
66
 
                result.append(i)
67
 
        return result
68
 
 
69
 
    def alarmsay(self, item):
70
 
        """ say alarm txt """
71
 
        bot = fleet.byname(item.botname)
72
 
        if bot:
73
 
            if item.printto:
74
 
                bot.say(item.printto, "[%s] %s" % (item.nick, item.txt))
75
 
            else:
76
 
                bot.say(item.nick, item.txt)
77
 
        self.delete(item.idnr)
78
 
 
79
 
    def add(self, botname, nick, ttime, txt, printto=None):
80
 
        """ add alarm """
81
 
        nick = nick.lower()
82
 
        nrid = nextid.next('alarms')
83
 
        item = Alarmitem(botname, nrid, nick, ttime, txt, printto=printto)
84
 
        pid = periodical.addjob(ttime - time.time(), 1, self.alarmsay, nick, \
85
 
item)
86
 
        item.idnr = pid
87
 
        self.data.append(item)
88
 
        self.save()
89
 
        return pid
90
 
 
91
 
    def delete(self, idnr):
92
 
        """ delete alarmnr """
93
 
        for i in range(len(self.data)-1, -1, -1):
94
 
            if self.data[i].idnr == idnr:
95
 
                del self.data[i]
96
 
                if periodical.killjob(idnr):
97
 
                    self.save()
98
 
                    return 1
99
 
 
100
 
alarms = Alarms(datadir + os.sep + 'alarms')
101
 
 
102
 
def shutdown():
103
 
    periodical.kill()
104
 
 
105
 
def size():
106
 
    """ return number of alarms """
107
 
    return alarms.size()
108
 
 
109
 
def handle_alarmadd(bot, ievent):
110
 
    """ alarm <txt-with-time> | <+delta> <txt> .. add an alarm """
111
 
    if ievent.cmnd == 'DCC':
112
 
        ievent.reply("sorry can't run alarm from dcc chat")
113
 
        return 
114
 
    if not ievent.rest:
115
 
        ievent.reply('alarm <txt-with-time> or alarm <+delta> <txt>')
116
 
        return
117
 
    else:
118
 
        alarmtxt = ievent.rest
119
 
    # see if alarm time is given as delta aka starts with +
120
 
    if alarmtxt[0] == '+':
121
 
        try:
122
 
            sec = int(ievent.args[0][1:]) # get nr of seconds to sleep
123
 
        except ValueError:
124
 
            ievent.reply('use +nrofsecondstosleep')
125
 
            return
126
 
        if len(ievent.args) < 2:
127
 
            ievent.reply('i need txt to remind you')
128
 
            return
129
 
        try:
130
 
            ttime = time.time() + sec
131
 
            # check for time overflow
132
 
            if ttime > 2**31:
133
 
                ievent.reply("time overflow")
134
 
                return
135
 
            # add alarm 
136
 
            nrid = alarms.add(bot.name, ievent.nick, ttime, \
137
 
' '.join(ievent.args[1:]), ievent.printto)
138
 
            ievent.reply("alarm %s set at %s" % (nrid, time.ctime(ttime)))
139
 
            return
140
 
        except Exception, ex:
141
 
            handle_exception(ievent)
142
 
            return
143
 
    # see if we can determine time from txt
144
 
    alarmtime = strtotime(alarmtxt)
145
 
    if not alarmtime:
146
 
        ievent.reply("can't detect time")
147
 
        return
148
 
    # check if alarm txt is provided
149
 
    txt = striptime(alarmtxt).strip()
150
 
    if not txt:
151
 
        ievent.reply('i need txt to remind you')
152
 
        return
153
 
    if time.time() > alarmtime:
154
 
        ievent.reply("we are already past %s" % time.ctime(alarmtime))
155
 
        return
156
 
    # add alarm
157
 
    nrid = alarms.add(bot.name, ievent.nick, alarmtime, txt, ievent.printto)
158
 
    ievent.reply("alarm %s set at %s" % (nrid, time.ctime(alarmtime)))
159
 
 
160
 
cmnds.add('alarm', handle_alarmadd, 'USER', allowqueue=False)
161
 
examples.add('alarm', 'say txt at a specific time or time diff', \
162
 
'1) alarm 12:00 lunchtime 2) alarm 3-11-2007 0:01 birthday ! 3) alarm +180 \
163
 
egg ready')
164
 
 
165
 
def handle_alarmlist(bot, ievent):
166
 
    """ alarm-list .. list all alarms """
167
 
    result = []
168
 
    for i in alarms.data:
169
 
        result.append("%s) %s: %s - %s " % (i.idnr, i.nick, \
170
 
time.ctime(i.time), i.txt))
171
 
    if result:
172
 
        ievent.reply("alarmlist: ", result, dot=True)
173
 
    else:
174
 
        ievent.reply('no alarms')
175
 
 
176
 
cmnds.add('alarm-list', handle_alarmlist, 'OPER')
177
 
examples.add('alarm-list', 'list current alarms', 'alarm-list')
178
 
 
179
 
def handle_myalarmslist(bot, ievent):
180
 
    """ alarm-mylist .. show alarms of user giving the command """
181
 
    result = []
182
 
    nick = ievent.nick.lower()
183
 
    for i in alarms.data:
184
 
        if i.nick == nick:
185
 
            result.append("%s) %s - %s " % (i.idnr, time.ctime(i.time), i.txt))
186
 
    if result:
187
 
        ievent.reply("your alarms: ", result, dot=True)
188
 
    else:
189
 
        ievent.reply('no alarms')
190
 
 
191
 
cmnds.add('alarm-mylist', handle_myalarmslist, 'USER')
192
 
examples.add('alarm-mylist', 'list alarms of user giving the commands', \
193
 
'alarm-mylist')
194
 
aliases.data['myalarms'] = 'alarm-mylist'
195
 
 
196
 
def handle_alarmdel(bot, ievent):
197
 
    """ alarm-del <nr> .. delete alarm """
198
 
    try:
199
 
        alarmnr = int(ievent.args[0])
200
 
    except IndexError:
201
 
        ievent.missing('<nr>')
202
 
        return
203
 
    except ValueError:
204
 
        ievent.reply('argument needs to be an integer')
205
 
        return
206
 
    if alarms.delete(alarmnr):
207
 
        ievent.reply('alarm with id %s deleted' % alarmnr)
208
 
    else:
209
 
        ievent.reply('failed to delete alarm with id %s' % alarmnr)
210
 
 
211
 
cmnds.add('alarm-del', handle_alarmdel, 'OPER')
212
 
examples.add('alarm-del', 'delete alarm with id <nr>', 'alarm-del 1')