from jsonrpcclient import request, parse, Ok
import requests


class SimpleRpcProxy:
    def __init__(self, url, timeout=60):
        self.url = url
        self.timeout = timeout

    def __getattr__(self, name):
        return RpcCaller(self.url, name, self.timeout)


class RpcCaller:
    def __init__(self, url, method, timeout):
        self.url = url
        self.method = method
        self.timeout = timeout

    def __call__(self, *args, **argsn):
        r = request(self.method, *args)
        try:
            response = requests.post(self.url, json=r, timeout=self.timeout)
            parsed = parse(response.json())
            if isinstance(parsed, Ok):
                return parsed.result
            else:
                print(
                    "Failed to call RPC, method = %s(%s), error = %s"
                    % (self.method, str(*args)[-1500:], parsed)
                )
        except Exception as ex:
            print(
                "Failed to call RPC, method = %s(%s), exception = %s"
                % (self.method, str(*args)[-1500:], ex)
            )
        return None