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

« back to all changes in this revision

Viewing changes to build/lib/gplugs/alchemy/karma.py

  • Committer: Package Import Robot
  • Author(s): Jeremy Malcolm
  • Date: 2012-04-03 21:58:28 UTC
  • mfrom: (3.1.11 sid)
  • Revision ID: package-import@ubuntu.com-20120403215828-6mik0tzug5na93la
Tags: 0.99.1-2
* Removes logfiles on purge (Closes: #668767)
* Reverted location of installed files back to /usr/lib/gozerbot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# plugs/karma.py
 
2
#
 
3
#
 
4
 
 
5
""" karma plugin """
 
6
 
 
7
__copyright__ = 'this file is in the public domain'
 
8
__depending__ = ['fans', 'quote']
 
9
 
 
10
from gozerbot.tests import tests
 
11
from gozerbot.commands import cmnds
 
12
from gozerbot.examples import examples
 
13
from gozerbot.redispatcher import rebefore
 
14
from gozerbot.datadir import datadir
 
15
from gozerbot.generic import handle_exception, rlog, lockdec
 
16
from gozerbot.utils.statdict import Statdict
 
17
from gozerbot.aliases import aliases
 
18
from gozerbot.plughelp import plughelp
 
19
from gozerbot.config import config
 
20
import thread, pickle, time, os
 
21
 
 
22
from gozerbot.database.alchemy import Base, create_all, engine, query, Session, dblocked
 
23
from datetime import datetime
 
24
from time import localtime
 
25
from sqlalchemy import Column, String, Integer, Text, DateTime, ForeignKey, Sequence
 
26
import sqlalchemy as sa
 
27
 
 
28
class Karma(Base):
 
29
    __tablename__ = 'karma'
 
30
    __table_args__ = {'useexisting': True}
 
31
    item = Column('item', String(255), primary_key=True)
 
32
    value = Column('value', Integer, nullable=False)
 
33
 
 
34
    def __init__(self, item, value):
 
35
        self.item = item
 
36
        self.value = value
 
37
 
 
38
class WhyKarma(Base):
 
39
    __tablename__ = 'whykarma'
 
40
    __table_args__ = {'useexisting': True}
 
41
    item = Column('item', String(255), nullable=False)
 
42
    updown = Column('updown', String(10), nullable=False)
 
43
    why = Column('why', Text, nullable=False)
 
44
    __mapper_args__ = {'primary_key':[item,updown,why]}
 
45
 
 
46
    def __init__(self, item, updown, why):
 
47
        self.item = item
 
48
        self.updown = updown
 
49
        self.why = why
 
50
 
 
51
class WhoKarma(Base):
 
52
    __tablename__ = 'whokarma'
 
53
    __table_args__ = {'useexisting': True}
 
54
    item = Column('item', String(255), nullable=False)
 
55
    nick = Column('nick', String(255), nullable=False)
 
56
    updown = Column('updown', String(10), nullable=False)
 
57
    __mapper_args__ = {'primary_key': [item, nick, updown]}
 
58
 
 
59
    def __init__(self, item, nick, updown):
 
60
        self.item = item
 
61
        self.nick = nick
 
62
        self.updown = updown
 
63
 
 
64
## UPGRADE PART
 
65
 
 
66
def upgrade():
 
67
    teller = 0
 
68
    oldfile = datadir + os.sep + 'old'
 
69
    dbdir = datadir + os.sep + 'db' + os.sep + 'karma.db'
 
70
    if os.path.exists(dbdir):
 
71
        try:
 
72
            from gozerbot.database.db import Db
 
73
            db = Db(dbtype='sqlite')
 
74
            db.connect('db/karma.db')
 
75
            result = db.execute(""" SELECT * FROM karma """)
 
76
            if result:
 
77
                for i in result:
 
78
                    karma.add(i[0], i[1])
 
79
                    teller += 1
 
80
            result = db.execute(""" SELECT * FROM whokarma """)
 
81
            if result:
 
82
                for i in result:
 
83
                    if i[2] == 'up':
 
84
                        karma.setwhoup(i[0], i[1])
 
85
                    else:
 
86
                        karma.setwhodown(i[0], i[1])
 
87
            result = db.execute(""" SELECT * FROM whykarma """)
 
88
            if result:
 
89
                for i in result:
 
90
                    karma.addwhy(*i)
 
91
        except Exception, ex:
 
92
            handle_exception()
 
93
        return teller
 
94
 
 
95
    try:
 
96
        from gozerbot.utils.generic import dosed
 
97
        from gozerbot.database.db import Db
 
98
        from gozerbot.compat.karma import Karma
 
99
 
 
100
        oldkarma = Karma(oldfile) 
 
101
 
 
102
        if not oldkarma:
 
103
            return
 
104
 
 
105
        k = oldkarma
 
106
        got = []
 
107
 
 
108
        rlog(10, 'karma', 'upgrading karma items')
 
109
        for i,j in k.karma.iteritems():
 
110
            if i in got:
 
111
                continue
 
112
            else:
 
113
                got.append(i)
 
114
                try:
 
115
                    karma.add(i,j)
 
116
                    teller += 1
 
117
                except sa.exc.IntegrityError, ex:
 
118
                    #if 'not unique' in str(ex):
 
119
                    #    continue
 
120
                    raise
 
121
 
 
122
        rlog(10, 'karma', 'upgrading reasonup')
 
123
        for i,j in k.reasonup.iteritems():
 
124
            for z in j:
 
125
                karma.addwhy(i, 'up', z)
 
126
 
 
127
        rlog(10, 'karma', 'upgrading reasondown')
 
128
        for i,j in k.reasondown.iteritems():
 
129
            for z in j:
 
130
                karma.addwhy(i, 'down', z)
 
131
 
 
132
        rlog(10, 'karma', 'upgrading whodown')
 
133
        for i,j in k.whodown.iteritems():
 
134
            for z in j:
 
135
                karma.setwhodown(i, z)
 
136
 
 
137
        rlog(10, 'karma', 'upgrading whoup')
 
138
        for i,j in k.whoup.iteritems():
 
139
            for z in j:
 
140
                karma.setwhoup(i, z)
 
141
 
 
142
    except Exception, ex:
 
143
        handle_exception()
 
144
        rlog(10, 'karma', 'failed to upgrade: %s' % str(ex))
 
145
        return
 
146
    rlog(10, 'karma', 'upgraded %s karma items' % str(teller))
 
147
 
 
148
# END UPGRADE PART
 
149
 
 
150
plughelp.add('karma', 'maintain karma of items .. use ++ to raise karma by 1 \
 
151
or use -- to lower by 1 .. reason might be given after a "#"')
 
152
 
 
153
class KarmaDb(object):
 
154
 
 
155
    """ karma object """
 
156
 
 
157
    def save(self):
 
158
        pass
 
159
 
 
160
    def size(self):
 
161
        """ return number of items """
 
162
        
 
163
        count = query(sa.func.count(Karma.item)).first()[0]
 
164
        return count
 
165
 
 
166
    @dblocked
 
167
    def add(self, item, value):
 
168
        item = item.lower()
 
169
        if Session.query(Karma).filter(Karma.item==item).count():
 
170
            rlog(10, 'karma', '%s item is already in database' % item)
 
171
            return
 
172
        #Session.begin()
 
173
        k = Karma(item=item, value=value)
 
174
        Session.add(k)
 
175
        #Session.commit()
 
176
        #Session.close()
 
177
        return 1
 
178
 
 
179
    def get(self, item):
 
180
        """ get karma of item """
 
181
        item = item.lower()
 
182
        karma = query(Karma).filter(Karma.item==item).first()
 
183
        if karma:
 
184
            return karma.value
 
185
 
 
186
    @dblocked
 
187
    def delete(self, item):
 
188
        """ delete karma item """
 
189
        item = item.lower()
 
190
        whokarma = Session.query(WhoKarma).filter(WhoKarma.item==item).all()
 
191
        whykarma = Session.query(WhyKarma).filter(WhyKarma.item==item).all()
 
192
        #Session.begin()
 
193
        for w in whokarma + whykarma:
 
194
                Session.delete(w)
 
195
        karma = Session.query(Karma).filter(Karma.item==item).first()
 
196
        if karma:
 
197
            Session.delete(karma)
 
198
        #Session.commit()
 
199
        #Session.close()
 
200
        return 1
 
201
 
 
202
    @dblocked
 
203
    def addwhy(self, item, updown, reason):
 
204
        """ add why of karma up/down """
 
205
        #Session.begin()
 
206
        item = item.lower()
 
207
        whykarma = WhyKarma(item, updown, reason)
 
208
        Session.add(whykarma)
 
209
        #Session.commit()
 
210
        #Session.close()
 
211
 
 
212
    @dblocked
 
213
    def upitem(self, item, reason=None):
 
214
        """ up a karma item with/without reason """
 
215
        item = item.lower()
 
216
        karma = Session.query(Karma).filter(Karma.item==item).first()
 
217
        #Session.begin()
 
218
        if not karma:
 
219
            karma = Karma(item, 0)
 
220
            Session.add(karma)
 
221
        karma.value = karma.value + 1
 
222
        if reason:
 
223
            whykarma = WhyKarma(item, 'up', reason.strip())
 
224
            Session.add(whykarma)
 
225
        #Session.commit()
 
226
        #Session.close()
 
227
 
 
228
    @dblocked
 
229
    def down(self, item, reason=None):
 
230
        """ lower a karma item with/without reason """
 
231
        item = item.lower()
 
232
        karma = Session.query(Karma).filter(Karma.item==item).first()
 
233
        #Session.begin()
 
234
        if not karma:
 
235
            karma = Karma(item, 0)
 
236
            Session.add(karma)
 
237
        karma.value = karma.value - 1
 
238
        if reason:
 
239
            whykarma = WhyKarma(item, 'down', reason.strip())
 
240
            Session.add(whykarma)
 
241
        #Session.commit()
 
242
        #Session.close()  
 
243
 
 
244
    def whykarmaup(self, item):
 
245
        """ get why of karma ups """
 
246
        item = item.lower()
 
247
        karma = query(WhyKarma).filter(WhyKarma.item==item).filter(WhyKarma.updown=='up')
 
248
        if karma:
 
249
            return [k.why for k in karma]
 
250
 
 
251
    def whykarmadown(self, item):
 
252
        """ get why of karma downs """
 
253
        item = item.lower()
 
254
        karma = query(WhyKarma).filter(WhyKarma.item==item).filter(WhyKarma.updown=='down')
 
255
        if karma:
 
256
            return [k.why for k in karma]
 
257
 
 
258
    @dblocked
 
259
    def setwhoup(self, item, nick):
 
260
        """ set who upped a karma item """
 
261
        #Session.begin()
 
262
        item = item.lower()
 
263
        nick = nick.lower()
 
264
        wk = WhoKarma(item, nick, 'up')
 
265
        Session.add(wk)
 
266
        #Session.commit()
 
267
        #Session.close()
 
268
 
 
269
    @dblocked
 
270
    def setwhodown(self, item, nick):
 
271
        """ set who lowered a karma item """
 
272
        #Session.begin()
 
273
        item = item.lower()
 
274
        nick = nick.lower()
 
275
        wk = WhoKarma(item, nick, 'down')
 
276
        Session.add(wk)
 
277
        #Session.commit()
 
278
        #Session.close()
 
279
 
 
280
    def getwhoup(self, item):
 
281
        """ get list of who upped a karma item """
 
282
        item = item.lower()
 
283
        karma = query(WhoKarma).filter(WhoKarma.item==item).filter(WhoKarma.updown=='up').all()
 
284
        if karma:
 
285
            return [k.nick for k in karma]
 
286
 
 
287
    def getwhodown(self, item):
 
288
        """ get list of who downed a karma item """
 
289
        item = item.lower()
 
290
        karma = query(WhoKarma).filter(WhoKarma.item==item).filter(WhoKarma.updown=='down').all()
 
291
        if karma:
 
292
            return [k.nick for k in karma]
 
293
 
 
294
    def search(self, item):
 
295
        """ search for matching karma item """
 
296
        item = item.lower()
 
297
        karma = query(Karma).filter(Karma.item.like('%%%s%%' % item))
 
298
        if karma:
 
299
            return karma
 
300
 
 
301
    def good(self, limit=10):
 
302
        """ show top 10 of karma items """
 
303
        statdict = Statdict()
 
304
        karma = query(Karma).all()
 
305
        if not karma:
 
306
            return []
 
307
        for i in karma:
 
308
            if i.item.startswith('quote '):
 
309
                continue
 
310
            statdict.upitem(i.item, i.value)
 
311
        return statdict.top(limit=limit)
 
312
 
 
313
    def bad(self, limit=10):
 
314
        """ show lowest 10 of negative karma items """
 
315
        statdict = Statdict()
 
316
        karma = query(Karma).all()
 
317
        if not karma:
 
318
            return []
 
319
        for i in karma:
 
320
            if i.item.startswith('quote '):
 
321
                continue
 
322
            statdict.upitem(i.item, i.value)
 
323
        return statdict.down(limit=limit)
 
324
 
 
325
    def quotegood(self, limit=10):
 
326
        """ show top 10 of karma items """
 
327
        statdict = Statdict()
 
328
        karma = query(Karma).all()
 
329
        if not karma:
 
330
            return []
 
331
        for i in karma:
 
332
            if not i.item.startswith('quote '):
 
333
                continue
 
334
            statdict.upitem(i.item, i.value)
 
335
        return statdict.top(limit=limit)
 
336
 
 
337
    def quotebad(self, limit=10):
 
338
        """ show lowest 10 of negative karma items """
 
339
        statdict = Statdict()
 
340
        karma = query(Karma).all()
 
341
        if not karma:
 
342
            return []
 
343
        for i in karma:
 
344
            if not i.item.startswith('quote '):
 
345
                continue
 
346
            statdict.upitem(i.item, i.value)
 
347
        return statdict.down(limit=limit)
 
348
 
 
349
    def whatup(self, nick):
 
350
        """ show what items are upped by nick """
 
351
        nick = nick.lower()
 
352
        statdict = Statdict()
 
353
        whokarma = query(WhoKarma).filter(WhoKarma.nick==nick).filter(WhoKarma.updown=='up')
 
354
        if not whokarma:
 
355
            return []
 
356
        for i in whokarma:
 
357
            statdict.upitem(i.item)
 
358
        return statdict.top()
 
359
 
 
360
    def whatdown(self, nick):
 
361
        """ show what items are upped by nick """
 
362
        nick = nick.lower()
 
363
        statdict = Statdict()
 
364
        whokarma = query(WhoKarma).filter(WhoKarma.nick==nick).filter(WhoKarma.updown=='down')
 
365
        if not whokarma:
 
366
            return []
 
367
        for i in whokarma:
 
368
            statdict.upitem(i.item)
 
369
        return statdict.top()
 
370
 
 
371
karma = KarmaDb()
 
372
create_all('karma')
 
373
assert(karma)
 
374
 
 
375
ratelimited = []
 
376
limiterlock = thread.allocate_lock()
 
377
limlock = lockdec(limiterlock)
 
378
nolimiter = False
 
379
 
 
380
def size():
 
381
    """ return number of kamra items """
 
382
    return karma.size()
 
383
 
 
384
def search(what, queue):
 
385
    rlog(10, 'karma', 'searched for %s' % what)
 
386
    result = karma.search(what)
 
387
    for i in result:
 
388
        queue.put_nowait("%s has karma %s" % (i.item, i.value))
 
389
 
 
390
@limlock
 
391
def ratelimit(bot, ievent):
 
392
    """ karma rate limiter """
 
393
    if nolimiter:
 
394
        return 1
 
395
    waittime = 30
 
396
    limit = 2
 
397
    try:
 
398
        name = ievent.userhost
 
399
        # Create a state for this user and his/her karma-state if necessary
 
400
        if not bot.state.has_key(name):
 
401
            bot.state[name] = {}
 
402
        if not bot.state[name].has_key('karma'):
 
403
            bot.state[name]['karma'] = {'count': 0, 'time': time.time() } 
 
404
        # If the waittime has elapsed, reset the counter
 
405
        if time.time() > (bot.state[name]['karma']['time'] + waittime):
 
406
            bot.state[name]['karma']['count'] = 0 
 
407
        # Update counter
 
408
        bot.state[name]['karma']['count'] += 1
 
409
        # If counter is too high, limit :)
 
410
        if bot.state[name]['karma']['count'] > limit:
 
411
            if name in ratelimited:
 
412
                return 0
 
413
            ievent.reply("karma limit reached, you'll have to wait %s \
 
414
seconds" % int((bot.state[name]['karma']['time'] + waittime) - time.time()))
 
415
            ratelimited.append(name)
 
416
            return 0
 
417
        # Update time
 
418
        bot.state[name]['karma']['time'] = time.time()
 
419
        # Ratelimiting passed :)
 
420
        try:
 
421
            ratelimited.remove(name)
 
422
        except ValueError:
 
423
            pass
 
424
        return 1
 
425
    except Exception, ex:
 
426
        handle_exception(ievent)
 
427
 
 
428
def handle_karmaget(bot, ievent):
 
429
    """ karma-get <item> .. show karma of item """
 
430
    if not ievent.rest:
 
431
        ievent.missing('<item>')
 
432
        return
 
433
    else:
 
434
        item = ievent.rest
 
435
    result = karma.get(item)
 
436
    if result:
 
437
        ievent.reply("%s has karma %s" % (item, str(result)))
 
438
    else:
 
439
        ievent.reply("%s has no karma yet" % item)
 
440
 
 
441
cmnds.add('karma-get', handle_karmaget, ['USER', 'WEB', 'ANONKARMA', 'CLOUD'])
 
442
examples.add('karma-get', 'karma-get <item> .. show karma of <item>', \
 
443
'karma-get dunker')
 
444
aliases.data['karma'] = 'karma-get'
 
445
 
 
446
def nolimit():
 
447
    global nolimiter
 
448
    nolimiter = True
 
449
 
 
450
def dolimit():
 
451
    global nolimiter
 
452
    nolimiter = False
 
453
 
 
454
tests.start(nolimit).add('gozerbot++').add('karma-get gozerbot', 'gozerbot has karma (\d+)').end(dolimit)
 
455
 
 
456
def handle_karmadel(bot, ievent):
 
457
    """ karma-del <item> .. delete karma item """
 
458
    if not ievent.rest:
 
459
        ievent.missing('<item>')
 
460
        return
 
461
    item = ievent.rest
 
462
    result = karma.delete(item)
 
463
    if result:
 
464
        ievent.reply("%s deleted" % item)
 
465
    else:
 
466
        ievent.reply("can't delete %s" % item)
 
467
 
 
468
cmnds.add('karma-del', handle_karmadel, ['OPER'])
 
469
examples.add('karma-del', 'karma-del <item> .. delete karma item', \
 
470
'karma-del dunker')
 
471
tests.add('boozer--').add('karma-del boozer', 'boozer deleted')
 
472
 
 
473
def handle_karmaup(bot, ievent):
 
474
    """ <item>++ ['#' <reason>] .. increase karma of item with optional \
 
475
        reason """
 
476
    if not ratelimit(bot, ievent):
 
477
        return
 
478
    (item, reason) = ievent.groups
 
479
    item = item.strip().lower()
 
480
    if not item:
 
481
        return
 
482
    karma.upitem(item, reason=reason)
 
483
    karma.setwhoup(item, ievent.nick)
 
484
    ievent.reply('karma of '+ item + ' is now ' + str(karma.get(item)))
 
485
 
 
486
rebefore.add(8, '^(.+)\+\+\s+#(.*)$', handle_karmaup, ['USER', 'KARMA', \
 
487
'ANONKARMA'],  allowqueue=False)
 
488
examples.add('++', "<item>++ ['#' <reason>] .. higher karma of item with 1 \
 
489
(use optional reason)", '1) gozerbot++ 2) gozerbot++ # top bot')
 
490
tests.add('gozerbot++', 'karma of gozerbot is now (\d+)')
 
491
tests.add('gozerbot++ # top bot', 'karma of gozerbot is now (\d+)')
 
492
 
 
493
def handle_karmaup2(bot, ievent):
 
494
    """ increase karma without reason """
 
495
    ievent.groups += [None, ]
 
496
    handle_karmaup(bot, ievent)
 
497
 
 
498
rebefore.add(9, '^(.+)\+\+$', handle_karmaup2, ['USER', 'ANONKARMA'], \
 
499
allowqueue=False)
 
500
 
 
501
def handle_karmadown(bot, ievent):
 
502
    """ <item>-- ['#' <reason> .. decrease karma item with reason """
 
503
    if not ratelimit(bot, ievent):
 
504
        return
 
505
    (item, reason) = ievent.groups
 
506
    item = item.strip().lower()
 
507
    if not item:
 
508
        return
 
509
    karma.down(item, reason=reason)
 
510
    karma.setwhodown(item, ievent.nick)
 
511
    ievent.reply('karma of ' + item + ' is now ' + str(karma.get(item)))
 
512
 
 
513
rebefore.add(8, '^(.+)\-\-\s+#(.*)$', handle_karmadown, ['USER', 'KARMA', \
 
514
'ANONKARMA'], allowqueue=False)
 
515
examples.add('--', "<item>-- ['#' <reason>] .. lower karma of item with 1 \
 
516
(use optional reason)", '1) gozerbot-- 2) gozerbot-- # bad bot')
 
517
tests.add('miep--', 'karma of miep is now (-\d+)')
 
518
tests.add('miep-- # top bot', 'karma of miep is now (-\d+)')
 
519
 
 
520
def handle_karmadown2(bot, ievent):
 
521
    """ decrease karma item without reason """
 
522
    ievent.groups += [None, ]
 
523
    handle_karmadown(bot, ievent)
 
524
 
 
525
rebefore.add(9, '^(.+)\-\-$', handle_karmadown2, ['USER', 'KARMA', \
 
526
'ANONKARMA'], allowqueue=False)
 
527
 
 
528
def handle_karmawhyup(bot, ievent):
 
529
    """ karma-whyup <item> .. show why karma of item has been increased """
 
530
    if not ievent.rest:
 
531
        ievent.missing('<item>')
 
532
        return
 
533
    item = ievent.rest
 
534
    result = karma.whykarmaup(item)
 
535
    if result:
 
536
        ievent.reply('whykarmaup of %s: ' % item, result, dot=True)
 
537
    else:
 
538
        ievent.reply('%s has no reason for karmaup yet' % item)
 
539
 
 
540
cmnds.add('karma-whyup', handle_karmawhyup, ['USER', 'WEB', \
 
541
'ANONKARMA'])
 
542
examples.add('karma-whyup', 'karma-whyup <item> .. show the reason why \
 
543
karma of <item> was raised', 'karma-whyup gozerbot')
 
544
aliases.data['wku'] = 'karma-whyup'
 
545
tests.add('gozerbot++ # top bot').add('karma-whyup gozerbot', 'top bot')
 
546
 
 
547
def handle_whykarmadown(bot, ievent):
 
548
    """ karma-whydown <item> .. show why karma of item has been decreased """
 
549
    if not ievent.rest:
 
550
        ievent.missing('<item>')
 
551
        return
 
552
    item = ievent.rest
 
553
    result = karma.whykarmadown(item)
 
554
    if result:
 
555
        ievent.reply('whykarmadown of %s: ' % item, result, dot=True)
 
556
    else:
 
557
        ievent.reply('%s has no reason for karmadown yet' % item)
 
558
 
 
559
cmnds.add('karma-whydown', handle_whykarmadown, ['USER', 'WEB', \
 
560
'ANONKARMA'])
 
561
examples.add('karma-whydown', 'karma-whydown <item> .. show the reason why \
 
562
karma of <item> was lowered', 'karma-whydown gozerbot')
 
563
aliases.data['wkd'] = 'karma-whydown'
 
564
tests.add('miep-- # kut bot').add('karma-whydown miep', 'kut bot')
 
565
 
 
566
def handle_karmagood(bot, ievent):
 
567
    """ karma-good .. show top 10 karma items """
 
568
    result = karma.good(limit=10)
 
569
    if result:
 
570
        res = []
 
571
        for i in result:
 
572
            if i[1] > 0:
 
573
                res.append("%s=%s" % (i[0], i[1]))
 
574
        ievent.reply('goodness: ', res, dot=True)
 
575
    else:
 
576
        ievent.reply('karma void')
 
577
 
 
578
cmnds.add('karma-good', handle_karmagood, ['USER', 'WEB', 'ANONKARMA', 'CLOUD'])
 
579
examples.add('karma-good', 'show top 10 karma', 'karma-good')
 
580
aliases.data['good'] = 'karma-good'
 
581
tests.add('gozerbot++').add('karma-good', 'gozerbot')
 
582
 
 
583
def handle_karmabad(bot, ievent):
 
584
    """ karma-bad .. show 10 most negative karma items """
 
585
    result = karma.bad(limit=10)
 
586
    if result:
 
587
        res = []
 
588
        for i in result:
 
589
            if i[1] < 0:
 
590
                res.append("%s=%s" % (i[0], i[1]))
 
591
        ievent.reply('badness: ', res, dot=True)
 
592
    else:
 
593
        ievent.reply('karma void')
 
594
 
 
595
cmnds.add('karma-bad', handle_karmabad, ['USER', 'WEB', 'ANONKARMA', 'CLOUD'])
 
596
examples.add('karma-bad', 'show lowest top 10 karma', 'karma-bad')
 
597
aliases.data['bad'] = 'karma-bad'
 
598
tests.add('miep--').add('karma-bad', 'miep')
 
599
 
 
600
def handle_whokarmaup(bot, ievent):
 
601
    """ karma-whoup <item> .. show who increased a karma item """
 
602
    if not ievent.rest:
 
603
        ievent.missing('<item>')
 
604
        return
 
605
    item = ievent.rest
 
606
    result = karma.getwhoup(item)
 
607
    if result:
 
608
        ievent.reply("whokarmaup of %s: " % item, result, dot=True)
 
609
    else:
 
610
        ievent.reply('no whokarmaup data available for %s' % item)
 
611
 
 
612
cmnds.add('karma-whoup', handle_whokarmaup, ['USER', 'WEB', \
 
613
'ANONKARMA', 'CLOUD'])
 
614
examples.add('karma-whoup', 'karma-whoup <item> .. show who raised the \
 
615
karma of <item>', 'karma-whoup gozerbot')
 
616
tests.add('gozerbot++').add('karma-whoup gozerbot', '{{ me }}')
 
617
 
 
618
def handle_whokarmadown(bot, ievent):
 
619
    """ karma-whodown <item> .. show who decreased a karma item """
 
620
    if not ievent.rest:
 
621
        ievent.missing('<item>')
 
622
        return
 
623
    item = ievent.rest
 
624
    result = karma.getwhodown(item)
 
625
    if result:
 
626
        ievent.reply("whokarmadown of %s: " % item, result, dot=True)
 
627
    else:
 
628
        ievent.reply('no whokarmadown data available for %s' % item)
 
629
 
 
630
cmnds.add('karma-whodown', handle_whokarmadown, ['USER', 'WEB', \
 
631
'ANONKARMA', 'CLOUD'])
 
632
examples.add('karma-whodown', 'karma-whodown <item> .. show who lowered \
 
633
the karma of <item>', 'karma-whodown gozerbot')
 
634
tests.add('miep--').add('karma-whodown miep', '{{ me }}')
 
635
 
 
636
def handle_karmasearch(bot, ievent):
 
637
    """ karma-search <txt> .. search for karma items """
 
638
    what = ievent.rest
 
639
    if not what:
 
640
        ievent.missing('<txt>')
 
641
        return
 
642
    result = karma.search(what)
 
643
    if result:
 
644
        res = []
 
645
        for i in result:
 
646
            res.append("%s (%s)" % (i.item, i.value))
 
647
        ievent.reply("karma items matching %s: " % what, res, dot=True)
 
648
    else:
 
649
        ievent.reply('no karma items matching %s found' % what)
 
650
 
 
651
cmnds.add('karma-search', handle_karmasearch, ['USER', 'WEB', \
 
652
'ANONKARMA', 'CLOUD'])
 
653
examples.add('karma-search', 'karma-search <txt> .. search karma' , \
 
654
'karma-search gozerbot')
 
655
tests.add('gozerbot++').add('karma-search gozer', 'gozerbot')
 
656
 
 
657
def handle_karmawhatup(bot, ievent):
 
658
    """ show what karma items have been upped by nick """
 
659
    try:
 
660
        nick = ievent.args[0]
 
661
    except IndexError:
 
662
        ievent.missing('<nick>')
 
663
        return
 
664
    result = karma.whatup(nick)
 
665
    if result:
 
666
        res = []
 
667
        for i in result:
 
668
            res.append("%s (%s)" % i)
 
669
        ievent.reply("karma items upped by %s: " % nick, res, dot=True)
 
670
    else:
 
671
        ievent.reply('no karma items upped by %s' % nick)
 
672
 
 
673
cmnds.add('karma-whatup', handle_karmawhatup, ['USER', 'WEB', \
 
674
'ANONKARMA', 'CLOUD'])
 
675
examples.add('karma-whatup', 'karma-whatup <nick> .. show what karma items \
 
676
<nick> has upped' , 'karma-whatup dunker')
 
677
tests.add('gozerbot++').add('karma-whatup {{ me }}', 'gozerbot')
 
678
 
 
679
def handle_karmawhatdown(bot, ievent):
 
680
    """ show what karma items have been lowered by nick """
 
681
    try:
 
682
        nick = ievent.args[0]
 
683
    except IndexError:
 
684
        ievent.missing('<nick>')
 
685
        return
 
686
    result = karma.whatdown(nick)
 
687
    if result:
 
688
        res = []
 
689
        for i in result:
 
690
            res.append("%s (%s)" % i)
 
691
        ievent.reply("karma items downed by %s: " % nick, res, dot=True)
 
692
    else:
 
693
        ievent.reply('no karma items downed by %s' % nick)
 
694
 
 
695
cmnds.add('karma-whatdown', handle_karmawhatdown, ['USER', 'WEB', \
 
696
'ANONKARMA', 'CLOUD'])
 
697
examples.add('karma-whatdown', 'karma-whatdown <nick> .. show what karma \
 
698
items <nick> has downed' , 'karma-whatdown dunker')
 
699
tests.add('miep--').add('karma-whatdown {{ me }}', 'miep')