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