]> gitweb.pimeys.fr Git - bots/basile.git/blob - nk.py
0ecf6f7c78ff9e3431bfaeef223306ae61304c88
[bots/basile.git] / nk.py
1 #!/usr/bin/python
2 # -*- coding:utf-8 -*-
3
4 # Codé par 20-100
5
6 """ Module de Basile pour dialoguer avec la NoteKfet2015 """
7
8 import socket
9 import json
10 import ssl
11 import traceback
12
13 #: Config de basile
14 import config
15
16 class NKError(Exception):
17 def __init__(self,msg):
18 Exception.__init__(self)
19 self.msg = msg
20 def __str__(self):
21 return str(self.msg)
22 def __unicode__(self):
23 return unicode(self.msg)
24
25 class NKRefused(NKError):
26 pass
27
28 class NKHelloFailed(NKError):
29 pass
30
31 class NKUnknownError(NKError):
32 pass
33
34 class NKDeadServer(NKError):
35 pass
36
37 def full_read(sock):
38 """Lit sur la socket jusqu'à ce que l'output soit déJSON-izable"""
39 output = ""
40 i = 0
41 while True:
42 output += sock.read()
43 i += 1
44 try:
45 return json.loads(output)
46 except:
47 pass
48 if i == 10 and output == "":
49 raise NKDeadServer
50
51 def connect():
52 sock = socket.socket()
53 try:
54 # On établit la connexion sur port 4242
55 sock.connect((config.nk_server, config.nk_port))
56 # On passe en SSL
57 sock = ssl.wrap_socket(sock, ca_certs='../keys/ca_.crt')
58 # On fait un hello
59 sock.write(json.dumps(["hello", "Basile"]))
60 # On récupère la réponse du hello
61 out = full_read(sock)
62 except Exception as exc:
63 # Si on a foiré quelque part, c'est que le serveur est down
64 raise NKRefused(str(exc))
65 if out["retcode"] == 0:
66 return sock
67 elif out["retcode"] == 11:
68 raise NKHelloFailed(out["errmsg"])
69 else:
70 raise NKUnknownError(out["errmsg"])
71
72
73 def login(username, password, typ="bdd"):
74 sock = connect()
75 if typ == "special": # ça c'est pour Basile lui-même
76 masque = []
77 elif typ == "bdd":
78 masque = [[], [], True]
79 try:
80 # Basile a un compte special user
81 commande = ["login", [username, password, typ, masque]]
82 sock.write(json.dumps(commande))
83 out = full_read(sock)
84 except Exception as exc:
85 # Si on a foiré quelque part, c'est que le serveur est down
86 raise NKRefused(str(exc))
87 return out, sock
88
89 def get_solde(sock, idbde, serv, canal):
90 """Récupère le (success, solde, pseudo) de l'utilisateur NK n°``idbde``"""
91 try:
92 sock.write(json.dumps(["compte", idbde]))
93 ret = full_read(sock)
94 retcode = ret["retcode"]
95 if retcode == 0:
96 solde = ret["msg"]["solde"]
97 pseudo = ret["msg"]["pseudo"]
98 return (True, solde, pseudo)
99 else:
100 serv.privmsg(canal, ret["errmsg"])
101 return (False, None, None)
102 except Exception as exc:
103 trace = traceback.format_exc()
104 msg = "failed\n%s" % trace
105 for l in msg.split("\n"):
106 serv.privmsg(canal, l)
107 #log(self.serveur, "priv", auteur, " ".join(message) + "[failed]")
108 return (False, None, None)
109