class NKUnknownError(NKError):
pass
+class NKDeadServer(NKError):
+ pass
+
+def full_read(sock):
+ """Lit sur la socket jusqu'à ce que l'output soit déJSON-izable"""
+ output = ""
+ i = 0
+ while True:
+ output += sock.read()
+ i += 1
+ try:
+ return json.loads(output)
+ except:
+ pass
+ if i == 10 and output == "":
+ raise NKDeadServer
+
def connect():
sock = socket.socket()
try:
# On fait un hello
sock.write(json.dumps(["hello", "Basile"]))
# On récupère la réponse du hello
- out = sock.read()
- out = json.loads(out)
+ out = full_read(sock)
except Exception as exc:
# Si on a foiré quelque part, c'est que le serveur est down
raise NKRefused(str(exc))
# Basile a un compte special user
commande = ["login", [username, password, typ, masque]]
sock.write(json.dumps(commande))
- out = sock.read()
+ out = full_read(sock)
except Exception as exc:
# Si on a foiré quelque part, c'est que le serveur est down
raise NKRefused(str(exc))
- return json.loads(out), sock
+ return out, sock
def get_solde(sock, idbde, serv, canal):
- """Récupère le (solde, pseudo, success) de l'utilisateur NK n°``idbde``"""
+ """Récupère le (success, solde, pseudo) de l'utilisateur NK n°``idbde``"""
try:
sock.write(json.dumps(["compte", idbde]))
- ret = json.loads(sock.read())
+ ret = full_read(sock)
retcode = ret["retcode"]
if retcode == 0:
solde = ret["msg"]["solde"]