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

« back to all changes in this revision

Viewing changes to build/lib/gozerplugs/plugs/lists.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/lists.py
2
 
#
3
 
#
4
 
 
5
 
""" lists per global/channel/user """
6
 
 
7
 
__copyright__ = 'this file is in the public domain'
8
 
 
9
 
from gozerbot.commands import cmnds
10
 
from gozerbot.examples import examples
11
 
from gozerbot.plughelp import plughelp
12
 
from gozerbot.users import users
13
 
from gozerbot.persist import Persist
14
 
from gozerbot.datadir import datadir
15
 
from gozerbot.nextid import nextid
16
 
import os
17
 
 
18
 
plughelp.add('lists', 'maintain lists')
19
 
 
20
 
# indx, username, listname, txt
21
 
lists = Persist(datadir + os.sep + 'newlists')
22
 
if not lists.data:
23
 
    lists.data = {}
24
 
 
25
 
def size():
26
 
    """ return number of lists """
27
 
    return len(lists.data)
28
 
 
29
 
def getlists(username):
30
 
    """ return lists of username """
31
 
    try:
32
 
        return lists.data[username].keys()
33
 
    except KeyError:
34
 
        return []
35
 
 
36
 
def getlist(username, listname):
37
 
    """ get list of username """
38
 
    listname = listname.strip()
39
 
    try:
40
 
        return lists.data[username][listname]
41
 
    except KeyError:
42
 
        return []
43
 
 
44
 
def addtolist(username, listname, item):
45
 
    """ add item to list of username """
46
 
    listname = listname.strip()
47
 
    nid = nextid.next('lists')
48
 
    if not lists.data.has_key(username):
49
 
        lists.data[username] = {}
50
 
    if not lists.data[username].has_key(listname):
51
 
        lists.data[username][listname] = []
52
 
    lists.data[username][listname].append((nid, item))
53
 
    lists.save()
54
 
 
55
 
def mergelist(username, listname, itemlist):
56
 
    """ merge new list into existing list """
57
 
    listname = listname.strip()
58
 
    nidlist = nextid.nextlist('lists', len(itemlist))
59
 
    if not lists.data.has_key(username):
60
 
        lists.data[username] = {}
61
 
    if not lists.data[username].has_key(listname):
62
 
        lists.data[username][listname] = []
63
 
    t = 0
64
 
    for i in itemlist:
65
 
        nid = nidlist[t]
66
 
        lists.data[username][listname].append((nid, i[1]))
67
 
        t += 1
68
 
    lists.save()
69
 
 
70
 
def delfromlist(username, listname, index):
71
 
    """ remove item at index from list """
72
 
    listname = listname.strip()
73
 
    try:
74
 
        l = lists.data[username][listname]
75
 
    except KeyError:
76
 
        return
77
 
    for i in range(len(l)-1, -1, -1):
78
 
        if l[i][0] == index:
79
 
            del l[i]
80
 
            lists.save()
81
 
            return 1
82
 
 
83
 
def handle_listsglobal(bot, ievent):
84
 
    """ lists <listname> [',' <item>] .. global lists"""
85
 
    if not ievent.rest:
86
 
        ievent.missing("<listname> [',' <item>]")
87
 
        return
88
 
    try:
89
 
        listname, item = ievent.rest.split(',', 1)
90
 
    except ValueError:
91
 
        l = getlist('all', ievent.rest)
92
 
        if not l:
93
 
            ievent.reply('no %s list available or empty' % ievent.rest)
94
 
            return
95
 
        result = []
96
 
        for i in l:
97
 
            result.append("%s) %s" % (i[0], i[1]))
98
 
        ievent.reply(result)
99
 
        return
100
 
    listname = listname.strip().lower()
101
 
    item = item.strip()
102
 
    if not listname or not item:
103
 
        ievent.missing("<listname> [',' <item>]")
104
 
        return
105
 
    addtolist('all', listname, item)
106
 
    ievent.reply('%s added to %s list' % (item, listname))
107
 
 
108
 
cmnds.add('lists-global', handle_listsglobal, 'USER')
109
 
examples.add('lists-global', "lists-global <listname> [',' <item>] .. show \
110
 
content of list or add item to list", '1) lists-global bla 2) lists-global \
111
 
bla, mekker')
112
 
 
113
 
def handle_listsglobaldel(bot, ievent):
114
 
    """ list-globaldel <listname> ',' <listofnrs> .. remove items with \
115
 
indexnr from list """
116
 
    if not ievent.rest:
117
 
        ievent.reply('<listname> , <listofnrs>')
118
 
        return
119
 
    try:
120
 
        listname, nrs = ievent.rest.split(',', 1)
121
 
    except ValueError:
122
 
        ievent.missing('<listname> , <listofnrs>')
123
 
        return
124
 
    nrslist = []
125
 
    try:
126
 
        for i in nrs:
127
 
            nrslist.append(int(i))
128
 
    except ValueError:
129
 
        ievent.reply('%s is not an integer' % i)
130
 
        return
131
 
    nrslist.sort()
132
 
    failed = []
133
 
    itemsdeleted = 0
134
 
    for i in nrslist:
135
 
        if not delfromlist('all', listname, i):
136
 
            failed.append(i)
137
 
        else:
138
 
            itemsdeleted += 1
139
 
    if failed:
140
 
        ievent.reply('failed to delete %s .. %s item(s) deleted' % \
141
 
(str(failed), itemsdeleted))
142
 
        return
143
 
    ievent.reply('%s item(s) removed' % itemsdeleted)
144
 
 
145
 
cmnds.add('lists-globaldel', handle_listsglobaldel, 'USER')
146
 
examples.add('lists-globaldel', "lists-globaldel <listname> ',' <listofnrs> \
147
 
.. remove items with indexnr from list", '1) lists-globaldel mekker , 1 2) \
148
 
lists-globaldel mekker , 0 3 6')
149
 
 
150
 
def handle_listsglobalshow(bot, ievent):
151
 
    """ show avaiable global lists """
152
 
    l = getlists('all')
153
 
    if not l:
154
 
        ievent.reply('no lists available')
155
 
        return
156
 
    else:
157
 
        ievent.reply("global lists: ", l, dot=True)
158
 
 
159
 
cmnds.add('lists-globalshow', handle_listsglobalshow, 'USER')
160
 
examples.add('lists-globalshow', 'show available global lists' , \
161
 
'lists-globalshow')
162
 
 
163
 
def handle_listschan(bot, ievent):
164
 
    """ lists-chan <listname> [',' <item>] .. global lists"""
165
 
    if not ievent.rest:
166
 
        ievent.missing("<listname> [',' <item>]")
167
 
        return
168
 
    try:
169
 
        listname, item = ievent.rest.split(',', 1)
170
 
    except ValueError:
171
 
        l = getlist(ievent.channel, ievent.rest)
172
 
        if not l:
173
 
            ievent.reply('no %s list available or empty' % ievent.rest)
174
 
            return
175
 
        result = []
176
 
        for i in l:
177
 
            result.append("%s) %s" % (i[0], i[1]))
178
 
        ievent.reply(result)
179
 
        return
180
 
    listname = listname.strip().lower()
181
 
    item = item.strip()
182
 
    if not listname or not item:
183
 
        ievent.missing("<listname> [',' <item>]")
184
 
        return
185
 
    addtolist(ievent.channel, listname, item)
186
 
    ievent.reply('%s added to %s list' % (item, listname))
187
 
 
188
 
cmnds.add('lists-chan', handle_listschan, 'USER')
189
 
examples.add('lists-chan', "lists-chan <listname> [',' <item>] .. show \
190
 
content of list or add item to list", '1) lists-chan bla 2) lists-chan \
191
 
bla, mekker')
192
 
 
193
 
def handle_listschandel(bot, ievent):
194
 
    """ lists-chandel <listname> ',' <listofnrs> .. remove items with \
195
 
indexnr from list """
196
 
    if not ievent.rest:
197
 
        ievent.reply('<listname> , <listofnrs>')
198
 
        return
199
 
    try:
200
 
        listname, nrs = ievent.rest.split(',', 1)
201
 
    except ValueError:
202
 
        ievent.missing('<listname> , <listofnrs>')
203
 
        return
204
 
    nrslist = []
205
 
    try:
206
 
        for i in nrs:
207
 
            nrslist.append(int(i))
208
 
    except ValueError:
209
 
        ievent.reply('%s is not an integer' % i)
210
 
        return
211
 
    nrslist.sort()
212
 
    failed = []
213
 
    itemsdeleted = 0
214
 
    for i in nrslist:
215
 
        if not delfromlist(ievent.channel, listname, i):
216
 
            failed.append(i)
217
 
        else:
218
 
            itemsdeleted += 1
219
 
    if failed:
220
 
        ievent.reply('failed to delete %s .. %s item(s) deleted' % \
221
 
(str(failed), itemsdeleted))
222
 
        return
223
 
    ievent.reply('%s item(s) removed' % itemsdeleted)
224
 
 
225
 
cmnds.add('lists-chandel', handle_listschandel, 'USER')
226
 
examples.add('lists-chandel', "lists-chandel <listname> ',' <listofnrs> \
227
 
.. remove items with indexnr from list", '1) lists-chandel mekker , 1 2) \
228
 
lists-chandel mekker , 0 3 6')
229
 
 
230
 
def handle_listschanshow(bot, ievent):
231
 
    """ show avaiable lists """
232
 
    l = getlists(ievent.channel)
233
 
    if not l:
234
 
        ievent.reply('no lists available')
235
 
        return
236
 
    else:
237
 
        ievent.reply("channel lists: ", l, dot=True)
238
 
 
239
 
cmnds.add('lists-chanshow', handle_listschanshow, 'USER')
240
 
examples.add('lists-chanshow', 'show available channel lists' , \
241
 
'lists-chanshow')
242
 
 
243
 
def handle_lists(bot, ievent):
244
 
    """ lists <listname> [',' <item>] .. global lists"""
245
 
    if not ievent.rest:
246
 
        ievent.missing("<listname> [',' <item>]")
247
 
        return
248
 
    username = users.getname(ievent.userhost)
249
 
    try:
250
 
        listname, item = ievent.rest.split(',', 1)
251
 
    except ValueError:
252
 
        l = getlist(username, ievent.rest)
253
 
        if not l:
254
 
            ievent.reply('no %s list available or empty' % ievent.rest)
255
 
            return
256
 
        result = []
257
 
        for i in l:
258
 
            result.append("%s) %s" % (i[0], i[1]))
259
 
        ievent.reply(result)
260
 
        return
261
 
    listname = listname.strip().lower()
262
 
    item = item.strip()
263
 
    if not listname or not item:
264
 
        ievent.missing("<listname> [',' <item>]")
265
 
        return
266
 
    addtolist(username, listname, item)
267
 
    ievent.reply('%s added to %s list' % (item, listname))
268
 
 
269
 
cmnds.add('lists', handle_lists, 'USER')
270
 
examples.add('lists', "lists <listname> [',' <item>] .. show content of list \
271
 
or add item to list", '1) lists bla 2) lists bla, mekker')
272
 
 
273
 
def handle_listsdel(bot, ievent):
274
 
    """ lists-del <listname> ',' <listofnrs> .. remove items with indexnr \
275
 
from list """
276
 
    if not ievent.rest:
277
 
        ievent.missing('<listname> , <listofnrs>')
278
 
        return
279
 
    try:
280
 
        listname, nrs = ievent.rest.split(',', 1)
281
 
    except ValueError:
282
 
        ievent.missing('<listname> , <listofnrs>')
283
 
        return
284
 
    nrslist = []
285
 
    try:
286
 
        for i in nrs.split():
287
 
            nrslist.append(int(i))
288
 
    except ValueError:
289
 
        ievent.reply('%s is not an integer' % i)
290
 
        return
291
 
    username = users.getname(ievent.userhost)
292
 
    nrslist.sort()
293
 
    failed = []
294
 
    itemsdeleted = 0
295
 
    for i in nrslist:
296
 
        if not delfromlist(username, listname, i):
297
 
            failed.append(i)
298
 
        else:
299
 
            itemsdeleted += 1
300
 
    if failed:
301
 
        ievent.reply('failed to delete %s .. %s item(s) deleted' % \
302
 
(str(failed), itemsdeleted))
303
 
        return
304
 
    ievent.reply('%s item(s) removed' % itemsdeleted)
305
 
 
306
 
cmnds.add('lists-del', handle_listsdel, 'USER')
307
 
examples.add('lists-del', "lists-del <listname> ',' <listofnrs> \
308
 
.. remove items with indexnr from list", '1) lists-del mekker , 1 2) \
309
 
lists-del mekker , 0 3 6')
310
 
 
311
 
def handle_listshow(bot, ievent):
312
 
    """ show avaiable lists """
313
 
    username = users.getname(ievent.userhost)
314
 
    l = getlists(username)
315
 
    if not l:
316
 
        ievent.reply('no lists available')
317
 
        return
318
 
    else:
319
 
        ievent.reply("your lists: ", l, dot=True)
320
 
 
321
 
cmnds.add('lists-show', handle_listshow, 'USER')
322
 
examples.add('lists-show', 'show available channel lists' , 'lists-show')
323
 
 
324
 
def handle_listsmerge(bot, ievent):
325
 
    """ merge two lists """
326
 
    try:
327
 
        (fromlist, tolist) = ievent.args
328
 
    except ValueError:
329
 
        ievent.missing('<fromlist> <tolist>')
330
 
        return
331
 
    username = users.getname(ievent.userhost)
332
 
    l = getlist(username, fromlist)
333
 
    if not l:
334
 
        ievent.reply('no %s list exists' % fromlist)
335
 
        return
336
 
    try:
337
 
        mergelist(username, tolist, l)
338
 
    except Exception, ex:
339
 
        ievent.reply('error: %s' % str(ex))
340
 
        return
341
 
    ievent.reply('%s items merged' % len(l))
342
 
 
343
 
cmnds.add('lists-merge', handle_listsmerge, 'USER')
344
 
examples.add('lists-merge', 'merge 2 lists (users lists only)', \
345
 
'lists-merge mekker miep')