]>
gitweb.pimeys.fr Git - bots/basile.git/blob - nk.py
7cec40aec4bcd2a15924f604ff56213a168fe17f
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_solde(sock
, idbde
, serv
, canal
):
96 """Récupère le (success, solde, pseudo) de l'utilisateur NK n°``idbde``"""
98 sock
.write(json
.dumps(["compte", idbde
]))
100 retcode
= ret
["retcode"]
102 solde
= ret
["msg"]["solde"]
103 pseudo
= ret
["msg"]["pseudo"]
104 return (True, solde
, pseudo
)
106 serv
.privmsg(canal
, ret
["errmsg"].encode("utf-8"))
107 return (False, None, None)
108 except Exception as exc
:
109 trace
= traceback
.format_exc()
110 msg
= "failed\n%s" % trace
111 for l
in msg
.split("\n"):
112 serv
.privmsg(canal
, l
)
113 #log(self.serveur, "priv", auteur, " ".join(message) + "[failed]")
114 return (False, None, None)
116 def consomme(sock
, idbde
, conso
, serv
, canal
):
117 """Fais consommer une conso à l'utilisateur NK n°``idbde``"""
119 sock
.write(json
.dumps(["get_boutons", ["", ""]]))
120 ret
= full_read(sock
)
121 retcode
= ret
["retcode"]
124 boutons
= [b
for b
in boutons
if b
["label"].lower() == conso
.lower()]
125 if len(boutons
) == 0:
126 serv
.privmsg(canal
, (u
"Impossible de trouver la conso %s" % (conso
)).encode("utf-8"))
129 sock
.write(json
.dumps(["consos", [[bouton
["id"], idbde
, 1]]]))
130 ret
= full_read(sock
)
131 if ret
["retcode"] == 0:
132 [[retcode
, [idbouton
, idbde
], errmsg
]] = ret
["msg"]
134 serv
.privmsg(canal
, errmsg
.encode("utf-8"))
136 success
, solde
, pseudo
= get_solde(sock
, idbde
, serv
, canal
)
138 serv
.privmsg(canal
, (u
"%s consomme 1 %s (nouveau solde : %.2f)" % (pseudo
, bouton
["label"], solde
/100.0)).encode("utf-8"))
140 serv
.privmsg(canal
, (u
"%s consommé mais impossible de récupérer le solde après transaction." % (bouton
["label"])).encode("utf-8"))
141 return True # on a réussi à consommer la conso
143 serv
.privmsg(canal
, ret
["errmsg"].encode("utf-8"))
146 serv
.privmsg(canal
, ret
["errmsg"])
147 except Exception as exc
:
148 trace
= traceback
.format_exc()
149 msg
= "failed\n%s" % trace
150 for l
in msg
.split("\n"):
151 serv
.privmsg(canal
, l
)