import json import account import os import time import datetime # Plugin Data info = { "name": "Multi Wallet Functions", "description": "Access and manage multiple wallets at once", "version": "1.0", "author": "Nathan.Woodburn/" } # Functions functions = { "balance": { "name": "Wallet Balances", "type": "default", "description": "List balances of all wallets", "params": {}, "returns": { "result": { "name": "Result", "type": "list" } } }, "domains": { "name": "Domains", "type": "default", "description": "List number of domains in each wallet", "params": {}, "returns": { "result": { "name": "Result", "type": "list" } } }, "find": { "name": "Find domain wallet", "type": "default", "description": "Find which wallet owns a domain", "params": { "domain": { "name": "List of Domain to find", "type": "text" } }, "returns": { "result": { "name": "Result", "type": "text" } } }, "expiring": { "name": "Expiring Domains", "type": "default", "description": "List domains that are expiring and their wallet", "params": { "days": { "name": "Days until expiry (default 30)", "type": "number" } }, "returns": { "result": { "name": "Result", "type": "text" } } }, "export": { "name": "Export Domains", "type": "default", "description": "Export domains to a file", "params": { }, "returns": { "result": { "name": "result.csv", "type": "file" } } }, "dash": { "name": "Dashboard widget", "type": "dashboard", "description": "List total balance of all wallets on your dashboard", "params": {}, "returns": { "result": { "name": "Total Holdings", "type": "text" } } }, "enable": { "name": "Enable Dashboard widget", "type": "default", "description": "Enable the dashboard widget", "params": {}, "returns": { "result": { "name": "Result", "type": "text" } } }, "disable": { "name": "Disable Dashboard widget", "type": "default", "description": "Disable the dashboard widget", "params": {}, "returns": { "result": { "name": "Result", "type": "text" } } } } if not os.path.exists("user_data/multiwallet.json"): with open("user_data/multiwallet.json", "w") as f: json.dump({ "enabled": False, "lastUpdate": 0 }, f) def balance(params, authentication): wallets = account.listWallets() balances = [] total = 0 available = 0 for wallet in wallets: info = account.getBalance(wallet) balances.append(f"{wallet}: Available: {info['available']:,.2f} HNS, Total: {info['total']:,.2f} HNS") total += info['total'] available += info['available'] balances.append(f"Total: Available: {available:,.2f} HNS, Total: {total:,.2f} HNS") return {"result": balances} def expiring(params, authentication): days = params['days'] if days == None or days == '': days = 30 else: days = int(days) wallets = account.listWallets() expiring = '' for wallet in wallets: walletExpiring = [] domains = account.getDomains(wallet) for domain in domains: if 'stats' in domain and 'daysUntilExpire' in domain['stats']: if domain['stats']['daysUntilExpire'] <= days: walletExpiring.append({"domain": domain['name'], "wallet": wallet, "days": domain['stats']['daysUntilExpire']}) if len(walletExpiring) > 0: expiring += f"<div class='row'><div class='col-md-12'><h3>Expiring Domains in {wallet}</h3><table class='table table-striped'><thead><tr><th>Domain</th><th>Days Until Expiration</th></tr></thead><tbody>" for domain in walletExpiring: expiring += f"<tr><td>{domain['domain']}</td><td>{domain['days']}</td></tr>" expiring += "</tbody></table></div></div>" return {"result": expiring} def BlocksToDate(blocks): date = datetime.datetime.now() + datetime.timedelta(minutes=blocks*10) return date.strftime("%Y-%m-%d %H:%M:%S") def export(params, authentication): wallets = account.listWallets() result = "name,expiry,expiryBlock,value,wallet" currentBlock = account.getBlockHeight() for wallet in wallets: domains = account.getDomains(wallet) for domain in domains: if 'stats' in domain and 'renewalPeriodEnd' in domain['stats']: expiryBlock = domain['stats']['renewalPeriodEnd'] result += f"\n{domain['name']},{BlocksToDate(expiryBlock - currentBlock)},{expiryBlock},{domain['value']/1000000},{wallet}" else: result += f"\n{domain['name']},N/A,N/A,{domain['value']/1000000},{wallet}" return {"result": result} def dash(params, authentication): with open("user_data/multiwallet.json", "r") as f: multiwallet = json.load(f) if multiwallet['enabled'] == False: return {"result": None} # Check time currentTime = int(time.time()) if currentTime - multiwallet['lastUpdate'] < 60*10: return {"result": f"Available: {multiwallet['total']['available']:,.2f} HNS<br>Total: {multiwallet['total']['total']:,.2f} HNS"} wallets = account.listWallets() total = 0 available = 0 for wallet in wallets: info = account.getBalance(wallet) total += info['total'] available += info['available'] multiwallet['total'] = { "available": available, "total": total } multiwallet['lastUpdate'] = currentTime with open("user_data/multiwallet.json", "w") as f: json.dump(multiwallet, f) return {"result": f"Available: {available:,.2f} HNS<br>Total: {total:,.2f} HNS"} def domains(params, authentication): wallets = account.listWallets() domains = [] total = 0 for wallet in wallets: numDomains = len(account.getDomains(wallet)) domains.append(f"{wallet}: {numDomains}") total += numDomains domains.append(f"Total: {total}") return {"result": domains} def find(params, authentication): wallets = account.listWallets() domain_owners = {} for wallet in wallets: domains = account.getDomains(wallet) for domain in domains: if domain['name'] in params['domain'].split(","): domain_owners[domain['name']] = wallet if len(domain_owners) > 0: result = '' for domain, wallet in domain_owners.items(): result += f"{domain}: {wallet}<br>" return {"result": result} else: return {"result": "Not found"} def enable(params, authentication): with open("user_data/multiwallet.json", "r") as f: multiwallet = json.load(f) multiwallet['enabled'] = True with open("user_data/multiwallet.json", "w") as f: json.dump(multiwallet, f) return {"result": "Success"} def disable(params, authentication): with open("user_data/multiwallet.json", "r") as f: multiwallet = json.load(f) multiwallet['enabled'] = False with open("user_data/multiwallet.json", "w") as f: json.dump(multiwallet, f) return {"result": "Success"}