]>
gitweb.pimeys.fr Git - bots/basile.git/blob - nk.py
917a396c3ad0537d01d3b6f6e3ac448c9dd0f4e6
6 """ Module de Basile pour dialoguer avec la NoteKfet2015 """
16 class NKError(Exception):
17 def __init__(self
,msg
):
18 Exception.__init
__(self
)
22 def __unicode__(self
):
23 return unicode(self
.msg
)
25 class NKRefused(NKError
):
28 class NKHelloFailed(NKError
):
31 class NKUnknownError(NKError
):
34 class NKDeadServer(NKError
):
38 """Lit sur la socket jusqu'à ce que l'output soit déJSON-izable"""
45 return json
.loads(output
)
48 if i
== 10 and output
== "":
52 sock
= socket
.socket()
54 # On établit la connexion sur port 4242
55 sock
.connect((config
.nk_server
, config
.nk_port
))
57 sock
= ssl
.wrap_socket(sock
, ca_certs
='../keys/ca_.crt')
59 sock
.write(json
.dumps(["hello", "Basile"]))
60 # On récupère la réponse du hello
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:
67 elif out
["retcode"] == 11:
68 raise NKHelloFailed(out
["errmsg"])
70 raise NKUnknownError(out
["errmsg"])
73 def login(username
, password
, typ
="bdd"):
75 if typ
== "special": # ça c'est pour Basile lui-même
78 masque
= [[], [], True]
80 # Basile a un compte special user
81 commande
= ["login", [username
, password
, typ
, masque
]]
82 sock
.write(json
.dumps(commande
))
84 except Exception as exc
:
85 # Si on a foiré quelque part, c'est que le serveur est down
86 raise NKRefused(str(exc
))
89 def get_solde(sock
, idbde
, serv
, canal
):
90 """Récupère le (success, solde, pseudo) de l'utilisateur NK n°``idbde``"""
92 sock
.write(json
.dumps(["compte", idbde
]))
94 retcode
= ret
["retcode"]
96 solde
= ret
["msg"]["solde"]
97 pseudo
= ret
["msg"]["pseudo"]
98 return (True, solde
, pseudo
)
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)
110 def consomme(sock
, idbde
, conso
, serv
, canal
):
111 """Fais consommer une conso à l'utilisateur NK n°``idbde``"""
113 sock
.write(json
.dumps(["get_boutons", ["", ""]]))
114 ret
= full_read(sock
)
115 retcode
= ret
["retcode"]
118 boutons
= [b
for b
in boutons
if b
["label"].lower() == conso
.lower()]
119 if len(boutons
) == 0:
120 serv
.privmsg(canal
, (u
"Impossible de trouver la conso %s" % (conso
)).encode("utf-8"))
123 sock
.write(json
.dumps(["consos", [[bouton
["id"], idbde
, 1]]]))
124 ret
= full_read(sock
)
125 if ret
["retcode"] == 0:
126 [[retcode
, [idbouton
, idbde
], errmsg
]] = ret
["msg"]
128 serv
.privmsg(canal
, errmsg
.encode("utf-8"))
130 success
, solde
, pseudo
= get_solde(sock
, idbde
, serv
, canal
)
132 serv
.privmsg(canal
, (u
"%s consomme 1 %s (nouveau solde : %.2f)" % (pseudo
, bouton
["label"], solde
/100.0)).encode("utf-8"))
134 serv
.privmsg(canal
, (u
"%s consommé mais impossible de récupérer le solde après transaction." % (bouton
["label"])).encode("utf-8"))
135 return True # on a réussi à consommer la conso
137 serv
.privmsg(canal
, ret
["errmsg"].encode("utf-8"))
140 serv
.privmsg(canal
, ret
["errmsg"])
141 except Exception as exc
:
142 trace
= traceback
.format_exc()
143 msg
= "failed\n%s" % trace
144 for l
in msg
.split("\n"):
145 serv
.privmsg(canal
, l
)