diff --git a/account.py b/account.py index 5b3dde1..6398e6f 100644 --- a/account.py +++ b/account.py @@ -15,6 +15,9 @@ ip = os.getenv("hsd_ip") if ip is None: ip = "localhost" +show_expired = os.getenv("show_expired") +if show_expired is None: + show_expired = False hsd = api.hsd(APIKEY,ip) hsw = api.hsw(APIKEY,ip) @@ -179,7 +182,21 @@ def getDomains(account,own=True): else: response = requests.get(f"http://x:{APIKEY}@{ip}:12039/wallet/{account}/name") info = response.json() - return info + + if show_expired: + return info + + # Remove any expired domains + domains = [] + for domain in info: + if 'stats' in domain: + if 'daysUntilExpire' in domain['stats']: + if domain['stats']['daysUntilExpire'] < 0: + continue + domains.append(domain) + + + return domains def getTransactions(account): # Get the transactions @@ -239,10 +256,6 @@ def check_hip2(domain: str): def send(account,address,amount): account_name = check_account(account) password = ":".join(account.split(":")[1:]) - - - - response = hsw.rpc_selectWallet(account_name) if response['error'] is not None: return { diff --git a/example.env b/example.env index 4b8ae7a..96a6a46 100644 --- a/example.env +++ b/example.env @@ -1,3 +1,4 @@ hsd_api=123480615465636893475aCwyaae6s45 hsd_ip=localhost -theme=black \ No newline at end of file +theme=black +show_expired=false \ No newline at end of file diff --git a/plugins/renewal.py b/plugins/renewal.py new file mode 100644 index 0000000..ac4ef44 --- /dev/null +++ b/plugins/renewal.py @@ -0,0 +1,97 @@ +import json +import account +import requests +import os + +# Plugin Data +info = { + "name": "Batch Renew Domains", + "description": "Renew the next 100 domains", + "version": "1.0", + "author": "Nathan.Woodburn/" +} + +# Functions +functions = { + "main":{ + "name": "Renew", + "type": "default", + "description": "Renew the next 100 domains in one transaction. Please wait for at least 1 block confirmation before renewing the next 100 domains", + "params": {}, + "returns": { + "status": + { + "name": "Status of the function", + "type": "text" + }, + "transaction": + { + "name": "Transaction ID", + "type": "tx" + } + } + } +} + +def main(params, authentication): + password = authentication.split(":")[1] + wallet = authentication.split(":")[0] + domains = account.getDomains(wallet) + domains = sorted(domains, key=lambda k: k['renewal']) + + names = [] + for domain in domains: + name = domain["name"] + names.append(name) + + # Split names into batches of 100 + batches = [] + for i in range(0, len(names), 100): + batches.append(names[i:i+100]) + + # Unlock wallet + api_key = os.getenv("hsd_api") + if api_key is None: + print("API key not set") + return {"status": "API key not set", "transaction": "None"} + response = requests.post(f'http://x:{api_key}@127.0.0.1:12039/wallet/{wallet}/unlock', + json={'passphrase': password, 'timeout': 600}) + if response.status_code != 200: + print("Failed to unlock wallet") + print(f'Status code: {response.status_code}') + print(f'Response: {response.text}') + return {"status": "Failed unlocking wallet", "transaction": "None"} + + + tx = "None" + for batch in batches: + batch = [] + + for domain in names: + batch.append(f'["RENEW", "{domain}"]') + + + batchTX = "[" + ", ".join(batch) + "]" + responseContent = f'{{"method": "sendbatch","params":[ {batchTX} ]}}' + response = requests.post(f'http://x:{api_key}@127.0.0.1:12039', data=responseContent) + if response.status_code != 200: + print("Failed to create batch") + print(f'Status code: {response.status_code}') + print(f'Response: {response.text}') + return {"status": "Failed", "transaction": "None"} + + batch = response.json() + # Verify the batch + print("Verifying tx...") + if batch["error"]: + if batch["error"] != "": + print("Failed to verify batch") + print(batch["error"]["message"]) + return {"status": "Failed", "transaction": "None"} + + if 'result' in batch: + if batch['result'] != None: + tx = batch['result']['hash'] + return {"status": "Success", "transaction": tx} + # Note only one batch can be sent at a time + \ No newline at end of file