X-Git-Url: http://gitweb.pimeys.fr/?p=bots%2Fbasile.git;a=blobdiff_plain;f=users.py;fp=users.py;h=49ddf4102bdd72657bab9b5f0c8f5ee41fd64b6a;hp=0000000000000000000000000000000000000000;hb=ee7a287b0f564671d100fa29ae0269c482ef4efe;hpb=bf6858eb5f5a79788801fd455837fe8f3f340460 diff --git a/users.py b/users.py new file mode 100644 index 0000000..49ddf41 --- /dev/null +++ b/users.py @@ -0,0 +1,108 @@ +# -*- encoding: utf-8 -*- + +""" Gestion des utilisateurs par Basile. """ + +import json + +import config + +class User(object): + """ Un utilisateur. Peut avoir plusieurs pseudos IRC, un seul idbde. """ + def __init__(self, pseudosirc, idbde): + self.pseudosirc, self.idbde = pseudosirc, idbde + + def jsonize(self): + d = {"pseudosirc" : self.pseudosirc, "idbde" : self.idbde} + return d + + def __unicode__(self): + """ Retourne l'utilisateur affichable """ + return unicode(self.jsonize()) + def __str__(self): + return unicode(self).encode("utf-8") + def __repr__(self): + return repr(str(self)) + + def __eq__(self, otheruser): + """ Teste l'égalité entre deux utilisateurs (= ont un pseudo IRC commun). + Accepte aussi en deuxième une chaîne de caractères. """ + myset = set([p.lower() for p in self.pseudosirc]) + if isinstance(otheruser, User): + hisset = [p.lower() for p in otheruser.pseudosirc] + else: + hisset = [otheruser.lower()] + return myset.intersection(hisset) != set() + +def load_file(filename): + """ Récupère les utilisateurs depuis le fichier """ + with open(filename) as f: + jsonusers = json.load(f) + users = [User(**u) for u in jsonusers] + return users + +def save_file(users, filename): + """ Enregistre les utilisateurs dans le fichier """ + with open(filename, "w") as f: + raws = [u.jsonize() for u in users] + json.dump(raws, f) + +class UserDB(object): + """ Stocke et distribue des utilisateurs. """ + def __init__(self): + self.userlist = [] + + def load(self): + """ Charge le fichier d'utilisateurs dans la DB """ + self.userlist = load_file(config.users_file) + + def save(self): + """ Sauvegarde la DB dans le fichier d'utilisateurs """ + save_file(self.userlist, config.users_file) + + def add(self, pseudoirc, idbde): + """ Enregistre un nouvel utilisateur, sauf si il existe déjà. """ + if not self.has(pseudoirc): + newuser = User(pseudosirc=[pseudoirc], idbde=idbde) + self.userlist.append(newuser) + self.save() + return True + return False + create = add + + def group(self, newpseudoirc, oldpseudoirc): + """ Enregistre un autre pseudo IRC à un utilisateur existant. """ + user = self[oldpseudoirc] + if newpseudoirc.lower() in [p.lower() for p in user.pseudosirc]: + return + user.pseudosirc.append(newpseudoirc) + self.save() + + def drop(self, idbde): + """ Enlève un utilisateur, via son idbde. """ + idrop = [i for (i, u) in enumerate(self.userlist) if u.idbde == idbde] + if idrop: + self.userlist.pop(idrop[0]) + self.save() + else: + raise KeyError("Pas d'utilisateur d'idbde %s." % (idbde,)) + + def __getitem__(self, pseudoirc): + """ Récupère un utilisateur par son pseudo IRC. """ + pseudo = pseudoirc.lower() + match = [u for u in self.userlist if pseudo in [p.lower() for p in u.pseudosirc]] + if match: + return match[0] + else: + raise KeyError("Utilisateur inexistant : %r" % pseudoirc) + + def has(self, pseudoirc): + """ Vérifie si cet utilisateur existe dans la base (case-insensitive). """ + try: + user = self[pseudoirc] + except KeyError: + return False + else: + return True + + def __repr__(self): + return repr(self.userlist)