]>
gitweb.pimeys.fr Git - bots/basile.git/blob - nk.py
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
):
37 def full_read(socket
):
38 # On récupère d'abord la taille du message
44 total
= int(length_str
)
45 # On utilise une memoryview pour recevoir les données chunk par chunk efficacement
46 view
= memoryview(bytearray(total
))
48 while total
- next_offset
> 0:
49 recv_size
= socket
.recv_into(view
[next_offset
:], total
- next_offset
)
50 next_offset
+= recv_size
52 msg
= json
.loads(view
.tobytes())
53 except (TypeError, ValueError) as e
:
54 raise NKNotJson("L'objet reçu n'est pas un JSON")
58 sock
= socket
.socket()
60 # On établit la connexion sur port 4242
61 sock
.connect((config
.nk_server
, config
.nk_port
))
63 sock
= ssl
.wrap_socket(sock
, ca_certs
='../keys/ca_.crt')
65 sock
.write(json
.dumps(["hello", "Basile"]))
66 # On récupère la réponse du hello
68 except Exception as exc
:
69 # Si on a foiré quelque part, c'est que le serveur est down
70 raise NKRefused(str(exc
))
71 if out
["retcode"] == 0:
73 elif out
["retcode"] == 11:
74 raise NKHelloFailed(out
["errmsg"])
76 raise NKUnknownError(out
["errmsg"])
79 def login(username
, password
, typ
="bdd"):
81 if typ
== "special": # ça c'est pour Basile lui-même
84 masque
= [[], [], True]
86 # Basile a un compte special user
87 commande
= ["login", [username
, password
, typ
, masque
]]
88 sock
.write(json
.dumps(commande
))
90 except Exception as exc
:
91 # Si on a foiré quelque part, c'est que le serveur est down
92 raise NKRefused(str(exc
))
95 def get_infos(sock
, idbde
, serv
, canal
):
96 """Récupère les données de l'utilisateur NK n°``idbde``"""
98 sock
.write(json
.dumps(["compte", idbde
]))
100 retcode
= ret
["retcode"]
104 serv
.privmsg(canal
, ret
["errmsg"].encode("utf-8"))
105 except Exception as exc
:
106 trace
= traceback
.format_exc()
107 msg
= "failed\n%s" % trace
108 for l
in msg
.split("\n"):
109 serv
.privmsg(canal
, l
)
110 #log(self.serveur, "priv", auteur, " ".join(message) + "[failed]")
112 def get_solde(sock
, idbde
, serv
, canal
):
113 """Récupère le (success, solde, pseudo) de l'utilisateur NK n°``idbde``"""
114 infos
= get_infos(sock
, idbde
, serv
, canal
)
116 return (True, infos
["solde"], infos
["pseudo"])
118 return (False, None, None)
120 def consomme(sock
, idbde
, conso
, serv
, canal
):
121 """Fais consommer une conso à l'utilisateur NK n°``idbde``"""
123 sock
.write(json
.dumps(["get_boutons", ["", ""]]))
124 ret
= full_read(sock
)
125 retcode
= ret
["retcode"]
128 boutons
= [b
for b
in boutons
if b
["label"].lower() == conso
.lower()]
129 if len(boutons
) == 0:
130 serv
.privmsg(canal
, (u
"Impossible de trouver la conso %s" % (conso
)).encode("utf-8"))
133 sock
.write(json
.dumps(["consos", [[bouton
["id"], idbde
, 1]]]))
134 ret
= full_read(sock
)
135 if ret
["retcode"] == 0:
136 [[retcode
, [idbouton
, idbde
], errmsg
]] = ret
["msg"]
138 serv
.privmsg(canal
, errmsg
.encode("utf-8"))
140 success
, solde
, pseudo
= get_solde(sock
, idbde
, serv
, canal
)
142 serv
.privmsg(canal
, (u
"%s consomme 1 %s (nouveau solde : %.2f)" % (pseudo
, bouton
["label"], solde
/100.0)).encode("utf-8"))
144 serv
.privmsg(canal
, (u
"%s consommé mais impossible de récupérer le solde après transaction." % (bouton
["label"])).encode("utf-8"))
145 return True # on a réussi à consommer la conso
147 serv
.privmsg(canal
, ret
["errmsg"].encode("utf-8"))
150 serv
.privmsg(canal
, ret
["errmsg"])
151 except Exception as exc
:
152 trace
= traceback
.format_exc()
153 msg
= "failed\n%s" % trace
154 for l
in msg
.split("\n"):
155 serv
.privmsg(canal
, l
)