From: Vincent Le Gallic Date: Fri, 14 Jun 2013 01:12:22 +0000 (+0200) Subject: Fonction full_read X-Git-Url: http://gitweb.pimeys.fr/?a=commitdiff_plain;h=a87c11b7881cce338b226c13e695300f84bd13d8;p=bots%2Fbasile.git Fonction full_read --- diff --git a/nk.py b/nk.py index 78b6594..0ecf6f7 100644 --- a/nk.py +++ b/nk.py @@ -31,6 +31,23 @@ class NKHelloFailed(NKError): 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: @@ -41,8 +58,7 @@ def connect(): # 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)) @@ -64,17 +80,17 @@ def login(username, password, typ="bdd"): # 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"]