import re, ConfigParser, os

@plugin
class Karma(object):
    def __init__(self, server):
        self.server = server
        self.prnt = server.prnt
        
        self.commands = [ "karma", "points" ]
        
        self.server.handle("message", self.handle_message)
        self.server.handle("command", self.handle_command, self.commands)
        
        self.userpoints = { }
        self.karmadbfile = self.server.config["confdir"] + "karma.cfg"
        
        self.karma_re = re.compile("^.+(\+\+|\-\-).*$")
        
        self.configParser = ConfigParser.RawConfigParser()
        if os.path.isfile(self.karmadbfile):
            self.configParser.read(self.karmadbfile)
            if self.configParser.has_section(self.server.config["network"]):
                for user,pts in self.configParser.items(self.server.config["network"]):
                    self.userpoints[user] = int(pts)
    
    def destroy(self):
        self.configParser = ConfigParser.RawConfigParser()
        if os.path.isfile(self.karmadbfile):
            self.configParser.read(self.karmadbfile)
        
        network = self.server.config["network"]
        if not self.configParser.has_section(network):
            self.configParser.add_section(network)
            
        for user,pts in self.userpoints.items():
            self.configParser.set(network,user,str(pts))
        
        fh = open(self.karmadbfile, "w")
        self.configParser.write(fh)
        fh.close()
    
    def handle_command(self, channel, user, cmd, args):
        if len(args) < 1:
            self.server.doMessage(channel, user+": Displays the amount of karma a user has. Usage: karma <nickname>")
            return
        
        if cmd == "karma" or cmd == "points":
            nick = args[0].lower()
            if self.userpoints.get(nick, None) is None:
                self.userpoints[nick] = 0
                
            self.server.doMessage(channel, user+": "+args[0]+" has "+str(self.userpoints[nick])+" points.")
            
    def handle_message(self, channel, user, message):
        if self.karma_re.match(message):
            ulist = [u for u in message.split(";") if u != '']
            addlist = [u[:-2].strip(" ") for u in ulist if u.endswith("++")]
            sublist = [u[:-2].strip(" ") for u in ulist if u.endswith("--")]
            
            for nick in addlist:
                lnick = nick.lower()
                if self.userpoints.get(lnick, None) is None:
                    self.userpoints[lnick] = 1
                else:
                    total = self.userpoints[lnick] + 1
                    self.userpoints[lnick] = total
            
            for nick in sublist:
                lnick = nick.lower()
                if self.userpoints.get(lnick, None) is None:
                    self.userpoints[lnick] = -1
                else:
                    total = self.userpoints[lnick] - 1
                    self.userpoints[lnick] = total