bbj/prototype/clients/network_client.py

65 lines
1.7 KiB
Python

from hashlib import sha256
import socket
import json
class BBJ:
def __init__(self, host, port):
self.host = host
self.port = port
self.username = None
self.auth_hash = None
def __call__(self, method, **params):
return self.request(method, **params)
def setuser(self, username, unhashed_password):
self.auth_hash = sha256(bytes(unhashed_password, "utf8")).hexdigest()
self.username = username
return self.auth_hash
def request(self, method, **params):
params["method"] = method
if not params.get("user") and self.username:
params["user"] = self.username
if not params.get("auth_hash") and self.auth_hash:
params["auth_hash"] = self.auth_hash
connection = socket.create_connection((self.host, self.port))
connection.sendall(bytes(json.dumps(params), "utf8"))
connection.shutdown(socket.SHUT_WR)
try:
buff, length = bytes(), 1
while length != 0:
recv = connection.recv(2048)
length = len(recv)
buff += recv
finally:
connection.close()
response = json.loads(str(buff, "utf8"))
if not isinstance(response, dict):
return response
error = response.get("error")
if not error:
return response
code, desc = error["code"], error["description"]
# tfw no qt3.14 python case switches
if error in (0, 1):
raise ChildProcessError("internal server error: " + desc)
elif error in (2, 3):
raise ChildProcessError(desc)
return response