Skip to content
Snippets Groups Projects
karma.py 2.53 KiB
Newer Older
Bruce Cowan's avatar
Bruce Cowan committed
# Copyright © 2016, 2018 Bruce Cowan <bruce@bcowan.eu>
Bruce Cowan's avatar
Bruce Cowan committed
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

Bruce Cowan's avatar
Bruce Cowan committed
from collections import defaultdict
Bruce Cowan's avatar
Bruce Cowan committed
import re
Bruce Cowan's avatar
Bruce Cowan committed

from errbot import BotPlugin, botcmd, re_botcmd
Bruce Cowan's avatar
Bruce Cowan committed


class Karma(BotPlugin):
    """Karma service"""

    def activate(self):
        super().activate()

Bruce Cowan's avatar
Bruce Cowan committed
        self.karma = self.get('karma', defaultdict(int))
Bruce Cowan's avatar
Bruce Cowan committed

    def deactivate(self):
        self['karma'] = self.karma
Bruce Cowan's avatar
Bruce Cowan committed

Bruce Cowan's avatar
Bruce Cowan committed
        super().deactivate()
Bruce Cowan's avatar
Bruce Cowan committed

Bruce Cowan's avatar
Bruce Cowan committed
    def _change_karma(self, target, value, message):
        self.karma[target] += value
        return "Karma for '{}' is now {}".format(target, self.karma[target])
    @re_botcmd(pattern=r'(.+)\+\+', prefixed=False, flags=re.IGNORECASE)
    def on_karma_inc(self, message, match):
Bruce Cowan's avatar
Bruce Cowan committed
        """Adds karma"""
        return self._change_karma(match.group(1), 1, message)
Bruce Cowan's avatar
Bruce Cowan committed

    @re_botcmd(pattern=r'(.+)--', prefixed=False, flags=re.IGNORECASE)
    def on_karma_dec(self, message, match):
Bruce Cowan's avatar
Bruce Cowan committed
        """Removes karma"""
        return self._change_karma(match.group(1), -1, message)
Bruce Cowan's avatar
Bruce Cowan committed

    @botcmd
    def karma(self, message, args):
        """Gets karma"""
        if not args:
            return "**Usage**: !karma <target>"

        return "Karma for '{}' is {}".format(args, self.karma[args])
Bruce Cowan's avatar
Bruce Cowan committed

    @botcmd
    def karma_top(self, message, args):
        """Gets the top 5 karmaed items"""
        if not self.karma:
            return "There are no karmaed items"

        keys = sorted(self.karma, key=self.karma.get, reverse=True)[:5]
        values = sorted(self.karma.values(), reverse=True)[:5]

        return ", ".join(["{}: {}".format(k, v) for k, v in zip(keys, values)])

    @botcmd
    def karma_bottom(self, message, args):
        """Gets the bottom 5 karmaed items"""
        if not self.karma:
            return "There are no karmaed items"

        keys = sorted(self.karma, key=self.karma.get)[:5]
        values = sorted(self.karma.values())[:5]

        return ", ".join(["{}: {}".format(k, v) for k, v in zip(keys, values)])