]> gitweb.pimeys.fr Git - bots/basile.git/blob - users.py
Meteo : bot mort et enterré depuis longtemps
[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 self.pending_whois = {}
59
60 def load(self):
61 """ Charge le fichier d'utilisateurs dans la DB """
62 self.userlist = load_file(config.users_file)
63
64 def save(self):
65 """ Sauvegarde la DB dans le fichier d'utilisateurs """
66 save_file(self.userlist, config.users_file)
67
68 def add(self, pseudoirc, idbde):
69 """ Enregistre un nouvel utilisateur, sauf si il existe déjà. """
70 if not self.has(pseudoirc):
71 newuser = User(pseudosirc=[pseudoirc], idbde=idbde)
72 self.userlist.append(newuser)
73 self.save()
74 return True
75 return False
76 create = add
77
78 def group(self, newpseudoirc, oldpseudoirc):
79 """ Enregistre un autre pseudo IRC à un utilisateur existant. """
80 user = self[oldpseudoirc]
81 if newpseudoirc.lower() in [p.lower() for p in user.pseudosirc]:
82 return
83 user.pseudosirc.append(newpseudoirc)
84 self.save()
85
86 def drop(self, idbde):
87 """ Enlève un utilisateur, via son idbde. """
88 idrop = [i for (i, u) in enumerate(self.userlist) if u.idbde == idbde]
89 if idrop:
90 self.userlist.pop(idrop[0])
91 self.save()
92 else:
93 raise KeyError("Pas d'utilisateur d'idbde %s." % (idbde,))
94
95 def __getitem__(self, pseudoirc):
96 """ Récupère un utilisateur par son pseudo IRC. """
97 pseudo = pseudoirc.lower()
98 match = [u for u in self.userlist if pseudo in [p.lower() for p in u.pseudosirc]]
99 if match:
100 return match[0]
101 else:
102 raise KeyError("Utilisateur inexistant : %r" % pseudoirc)
103
104 def has(self, pseudoirc):
105 """ Vérifie si cet utilisateur existe dans la base (case-insensitive). """
106 try:
107 user = self[pseudoirc]
108 except KeyError:
109 return False
110 else:
111 return True
112
113 def __repr__(self):
114 return repr(self.userlist)