]> gitweb.pimeys.fr Git - bots/basile.git/commitdiff
Fonction full_read
authorVincent Le Gallic <legallic@crans.org>
Fri, 14 Jun 2013 01:12:22 +0000 (03:12 +0200)
committerVincent Le Gallic <legallic@crans.org>
Fri, 14 Jun 2013 01:12:22 +0000 (03:12 +0200)
nk.py

diff --git a/nk.py b/nk.py
index 78b6594c1bd37d66d79ae0a1d185bea10db72ddb..0ecf6f7c78ff9e3431bfaeef223306ae61304c88 100644 (file)
--- 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"]