]> gitweb.pimeys.fr Git - bots/basile.git/blob - nk.py
78b6594c1bd37d66d79ae0a1d185bea10db72ddb
[bots/basile.git] / nk.py
1 #!/usr/bin/python
2 # -*- coding:utf-8 -*-
3
4 # Codé par 20-100
5
6 """ Module de Basile pour dialoguer avec la NoteKfet2015 """
7
8 import socket
9 import json
10 import ssl
11 import traceback
12
13 #: Config de basile
14 import config
15
16 class NKError(Exception):
17 def __init__(self,msg):
18 Exception.__init__(self)
19 self.msg = msg
20 def __str__(self):
21 return str(self.msg)
22 def __unicode__(self):
23 return unicode(self.msg)
24
25 class NKRefused(NKError):
26 pass
27
28 class NKHelloFailed(NKError):
29 pass
30
31 class NKUnknownError(NKError):
32 pass
33
34 def connect():
35 sock = socket.socket()
36 try:
37 # On établit la connexion sur port 4242
38 sock.connect((config.nk_server, config.nk_port))
39 # On passe en SSL
40 sock = ssl.wrap_socket(sock, ca_certs='../keys/ca_.crt')
41 # On fait un hello
42 sock.write(json.dumps(["hello", "Basile"]))
43 # On récupère la réponse du hello
44 out = sock.read()
45 out = json.loads(out)
46 except Exception as exc:
47 # Si on a foiré quelque part, c'est que le serveur est down
48 raise NKRefused(str(exc))
49 if out["retcode"] == 0:
50 return sock
51 elif out["retcode"] == 11:
52 raise NKHelloFailed(out["errmsg"])
53 else:
54 raise NKUnknownError(out["errmsg"])
55
56
57 def login(username, password, typ="bdd"):
58 sock = connect()
59 if typ == "special": # ça c'est pour Basile lui-même
60 masque = []
61 elif typ == "bdd":
62 masque = [[], [], True]
63 try:
64 # Basile a un compte special user
65 commande = ["login", [username, password, typ, masque]]
66 sock.write(json.dumps(commande))
67 out = sock.read()
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 return json.loads(out), sock
72
73 def get_solde(sock, idbde, serv, canal):
74 """Récupère le (solde, pseudo, success) de l'utilisateur NK n°``idbde``"""
75 try:
76 sock.write(json.dumps(["compte", idbde]))
77 ret = json.loads(sock.read())
78 retcode = ret["retcode"]
79 if retcode == 0:
80 solde = ret["msg"]["solde"]
81 pseudo = ret["msg"]["pseudo"]
82 return (True, solde, pseudo)
83 else:
84 serv.privmsg(canal, ret["errmsg"])
85 return (False, None, None)
86 except Exception as exc:
87 trace = traceback.format_exc()
88 msg = "failed\n%s" % trace
89 for l in msg.split("\n"):
90 serv.privmsg(canal, l)
91 #log(self.serveur, "priv", auteur, " ".join(message) + "[failed]")
92 return (False, None, None)
93