]> gitweb.pimeys.fr Git - bots/basile.git/blob - users.py
vouvoiement
[bots/basile.git] / users.py
1 # -*- encoding: utf-8 -*-
2
3 """ Gestion des utilisateurs par Basile. """
4
5 import json
6
7 import config
8
9 class User(object):
10 """ Un utilisateur. Peut avoir plusieurs pseudos IRC, un seul idbde. """
11 def __init__(self, pseudosirc, idbde):
12 self.pseudosirc, self.idbde = pseudosirc, idbde
13
14 def jsonize(self):
15 d = {"pseudosirc" : self.pseudosirc, "idbde" : self.idbde}
16 return d
17
18 def __unicode__(self):
19 """ Retourne l'utilisateur affichable """
20 return unicode(self.jsonize())
21 def __str__(self):
22 return unicode(self).encode("utf-8")
23 def __repr__(self):
24 return repr(str(self))
25
26 def __eq__(self, otheruser):
27 """ Teste l'égalité entre deux utilisateurs (= ont un pseudo IRC commun).
28 Accepte aussi en deuxième une chaîne de caractères. """
29 myset = set([p.lower() for p in self.pseudosirc])
30 if isinstance(otheruser, User):
31 hisset = [p.lower() for p in otheruser.pseudosirc]
32 else:
33 hisset = [otheruser.lower()]
34 return myset.intersection(hisset) != set()
35
36 def load_file(filename):
37 """ Récupère les utilisateurs depuis le fichier """
38 with open(filename) as f:
39 jsonusers = json.load(f)
40 users = [User(**u) for u in jsonusers]
41 return users
42
43 def save_file(users, filename):
44 """ Enregistre les utilisateurs dans le fichier """
45 with open(filename, "w") as f:
46 raws = [u.jsonize() for u in users]
47 json.dump(raws, f)
48
49 class UserDB(object):
50 """ Stocke et distribue des utilisateurs. """
51 def __init__(self):
52 self.userlist = []
53
54 def load(self):
55 """ Charge le fichier d'utilisateurs dans la DB """
56 self.userlist = load_file(config.users_file)
57
58 def save(self):
59 """ Sauvegarde la DB dans le fichier d'utilisateurs """
60 save_file(self.userlist, config.users_file)
61
62 def add(self, pseudoirc, idbde):
63 """ Enregistre un nouvel utilisateur, sauf si il existe déjà. """
64 if not self.has(pseudoirc):
65 newuser = User(pseudosirc=[pseudoirc], idbde=idbde)
66 self.userlist.append(newuser)
67 self.save()
68 return True
69 return False
70 create = add
71
72 def group(self, newpseudoirc, oldpseudoirc):
73 """ Enregistre un autre pseudo IRC à un utilisateur existant. """
74 user = self[oldpseudoirc]
75 if newpseudoirc.lower() in [p.lower() for p in user.pseudosirc]:
76 return
77 user.pseudosirc.append(newpseudoirc)
78 self.save()
79
80 def drop(self, idbde):
81 """ Enlève un utilisateur, via son idbde. """
82 idrop = [i for (i, u) in enumerate(self.userlist) if u.idbde == idbde]
83 if idrop:
84 self.userlist.pop(idrop[0])
85 self.save()
86 else:
87 raise KeyError("Pas d'utilisateur d'idbde %s." % (idbde,))
88
89 def __getitem__(self, pseudoirc):
90 """ Récupère un utilisateur par son pseudo IRC. """
91 pseudo = pseudoirc.lower()
92 match = [u for u in self.userlist if pseudo in [p.lower() for p in u.pseudosirc]]
93 if match:
94 return match[0]
95 else:
96 raise KeyError("Utilisateur inexistant : %r" % pseudoirc)
97
98 def has(self, pseudoirc):
99 """ Vérifie si cet utilisateur existe dans la base (case-insensitive). """
100 try:
101 user = self[pseudoirc]
102 except KeyError:
103 return False
104 else:
105 return True
106
107 def __repr__(self):
108 return repr(self.userlist)