github.com/mit-dci/lit@v0.0.0-20221102210550-8c3d3b49f2ce/cmd/litpy/litrpc.py (about) 1 #!/usr/bin/env python3 2 # Copyright (c) 2017 The lit developers 3 # Distributed under the MIT software license, see the accompanying 4 # file LICENSE or http://www.opensource.org/licenses/mit-license.php. 5 """Python interface to lit""" 6 7 import json 8 import logging 9 import random 10 import time 11 import websocket # `pip install websocket-client` 12 13 logger = logging.getLogger("litrpc") 14 15 class LitConnection(): 16 """A class representing a connection to a lit node.""" 17 def __init__(self, ip, port): 18 self.ip = ip 19 self.port = port 20 21 def connect(self): 22 """Connect to the node. Continue trying for 10 seconds""" 23 logger.debug("Opening RPC connection to litnode %s:%s" % (self.ip, self.port)) 24 self.ws = websocket.WebSocket() 25 for _ in range(50): 26 try: 27 self.ws.connect("ws://%s:%s/ws" % (self.ip, self.port)) 28 except ConnectionRefusedError: 29 # lit is not ready to accept connections yet 30 time.sleep(0.25) 31 else: 32 # No exception - we're connected! 33 break 34 self.msg_id = random.randint(0, 9999) 35 36 def send_message(self, method, params): 37 """Sends a websocket message to the lit node""" 38 logger.debug("Sending rpc message to %s:%s %s(%s)" % (self.ip, self.port, method, str(params))) 39 self.ws.send(json.dumps({"method": "LitRPC.%s" % method, 40 "params": [params], 41 "jsonrpc": "2.0", 42 "id": str(self.msg_id)})) 43 44 self.msg_id = self.msg_id + 1 % 10000 45 46 resp = json.loads(self.ws.recv()) 47 logger.debug("Received rpc response from %s:%s method: %s Response: %s." % (self.ip, self.port, method, str(resp))) 48 return resp 49 50 def __getattr__(self, name): 51 """Dispatches any unrecognised messages to the websocket connection""" 52 def dispatcher(**kwargs): 53 return self.send_message(name, kwargs) 54 return dispatcher 55 56 def new_address(self): 57 """Add a new wallit address""" 58 return self.Address(NumToMake=1) 59 60 def balance(self): 61 """Get wallit balance""" 62 return self.Bal()