X-Git-Url: http://gitweb.pimeys.fr/?p=bots%2Fbasile.git;a=blobdiff_plain;f=nk.py;h=0cbaed023bd3149f95cb1330126db4e48f2e8f01;hp=ecad88fd4a482357240b47d4947dd35790d1d2cb;hb=667757031c816e434da2065b2d129402a7a72f5f;hpb=bf0ca5fa90df6a7c1c094c904ec824700dff4787 diff --git a/nk.py b/nk.py index ecad88f..0cbaed0 100644 --- a/nk.py +++ b/nk.py @@ -8,6 +8,7 @@ import socket import json import ssl +import traceback #: Config de basile import config @@ -30,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: @@ -40,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)) @@ -63,9 +80,67 @@ 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 (success, solde, pseudo) de l'utilisateur NK n°``idbde``""" + try: + sock.write(json.dumps(["compte", idbde])) + ret = full_read(sock) + retcode = ret["retcode"] + if retcode == 0: + solde = ret["msg"]["solde"] + pseudo = ret["msg"]["pseudo"] + return (True, solde, pseudo) + else: + serv.privmsg(canal, ret["errmsg"]) + return (False, None, None) + except Exception as exc: + trace = traceback.format_exc() + msg = "failed\n%s" % trace + for l in msg.split("\n"): + serv.privmsg(canal, l) + #log(self.serveur, "priv", auteur, " ".join(message) + "[failed]") + return (False, None, None) + +def consomme(sock, idbde, conso, serv, canal): + """Fais consommer une conso à l'utilisateur NK n°``idbde``""" + try: + sock.write(json.dumps(["get_boutons", ["", ""]])) + ret = full_read(sock) + retcode = ret["retcode"] + if retcode == 0: + boutons = ret["msg"] + boutons = [b for b in boutons if b["label"].lower() == conso.lower()] + if len(boutons) == 0: + serv.privmsg(canal, (u"Impossible de trouver la conso %s" % (conso)).encode("utf-8")) + return False + bouton = boutons[0] + sock.write(json.dumps(["consos", [[bouton["id"], idbde, 1]]])) + ret = full_read(sock) + if ret["retcode"] == 0: + [[retcode, [idbouton, idbde], errmsg]] = ret["msg"] + if retcode != 0: + serv.privmsg(canal, errmsg) + else: + success, solde, pseudo = get_solde(sock, idbde, serv, canal) + if success: + serv.privmsg(canal, (u"%s consomme 1 %s (nouveau solde : %.2f)" % (pseudo, bouton["label"], solde/100.0)).encode("utf-8")) + else: + serv.privmsg(canal, (u"%s consommé mais impossible de récupérer le solde après transaction." % (bouton["label"])).encode("utf-8")) + return True # on a réussi à consommer la conso + else: + serv.privmsg(canal, ret["errmsg"].encode("utf-8")) + return False + else: + serv.privmsg(canal, ret["errmsg"]) + except Exception as exc: + trace = traceback.format_exc() + msg = "failed\n%s" % trace + for l in msg.split("\n"): + serv.privmsg(canal, l)