feat: Add ruff linting
Some checks failed
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 43s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 46s
Test Python Compatibility / Python-Compatibility (3.11) (push) Failing after 1m40s
Test Python Compatibility / Python-Compatibility (3.10) (push) Failing after 1m44s
Test Python Compatibility / Python-Compatibility (3.13) (push) Failing after 1m40s
Some checks failed
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 43s
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 46s
Test Python Compatibility / Python-Compatibility (3.11) (push) Failing after 1m40s
Test Python Compatibility / Python-Compatibility (3.10) (push) Failing after 1m44s
Test Python Compatibility / Python-Compatibility (3.13) (push) Failing after 1m40s
This commit is contained in:
@@ -9,14 +9,14 @@ jobs:
|
|||||||
container: catthehacker/ubuntu:act-latest
|
container: catthehacker/ubuntu:act-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
python-version: ['3.8', '3.10', '3.13']
|
python-version: ['3.10', '3.11', '3.13']
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
@@ -27,9 +27,14 @@ jobs:
|
|||||||
if [ -f requirements.txt ]; then
|
if [ -f requirements.txt ]; then
|
||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
fi
|
fi
|
||||||
pip install pytest
|
pip install pytest ruff
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: |
|
run: |
|
||||||
echo "Testing with Python ${{ matrix.python-version }}"
|
echo "Testing with Python ${{ matrix.python-version }}"
|
||||||
python -m pytest main.py
|
python -m pytest main.py
|
||||||
|
|
||||||
|
- name: Lint with ruff
|
||||||
|
run: |
|
||||||
|
echo "Linting with Python ${{ matrix.python-version }}"
|
||||||
|
ruff check
|
||||||
71
account.py
71
account.py
@@ -130,7 +130,7 @@ def check_password(cookie: str|None, password: str|None):
|
|||||||
password = ""
|
password = ""
|
||||||
|
|
||||||
account = check_account(cookie)
|
account = check_account(cookie)
|
||||||
if account == False:
|
if not account:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# Check if the password is valid
|
# Check if the password is valid
|
||||||
@@ -638,7 +638,7 @@ def check_address(address: str, allow_name: bool = True, return_address: bool =
|
|||||||
return False
|
return False
|
||||||
return 'Invalid address'
|
return 'Invalid address'
|
||||||
|
|
||||||
if response['result']['isvalid'] == True:
|
if response['result']['isvalid']:
|
||||||
if return_address:
|
if return_address:
|
||||||
return address
|
return address
|
||||||
return 'Valid address'
|
return 'Valid address'
|
||||||
@@ -788,7 +788,7 @@ def getAddressFromCoin(coinhash: str, coinindex = 0):
|
|||||||
# Get the address from the hash
|
# Get the address from the hash
|
||||||
response = requests.get(get_node_api_url(f"coin/{coinhash}/{coinindex}"))
|
response = requests.get(get_node_api_url(f"coin/{coinhash}/{coinindex}"))
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
print(f"Error getting address from coin")
|
print("Error getting address from coin")
|
||||||
return "No Owner"
|
return "No Owner"
|
||||||
data = response.json()
|
data = response.json()
|
||||||
if 'address' not in data:
|
if 'address' not in data:
|
||||||
@@ -801,7 +801,7 @@ def renewDomain(account, domain):
|
|||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
password = ":".join(account.split(":")[1:])
|
password = ":".join(account.split(":")[1:])
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -834,7 +834,7 @@ def getDNS(domain: str):
|
|||||||
return {
|
return {
|
||||||
"error": "No DNS records"
|
"error": "No DNS records"
|
||||||
}
|
}
|
||||||
if response['result'] == None:
|
if response['result'] is None:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
if 'records' not in response['result']:
|
if 'records' not in response['result']:
|
||||||
@@ -846,7 +846,7 @@ def setDNS(account, domain, records):
|
|||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
password = ":".join(account.split(":")[1:])
|
password = ":".join(account.split(":")[1:])
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -918,7 +918,7 @@ def getNodeSync():
|
|||||||
|
|
||||||
def getWalletStatus():
|
def getWalletStatus():
|
||||||
response = hsw.rpc_getWalletInfo()
|
response = hsw.rpc_getWalletInfo()
|
||||||
if 'error' in response and response['error'] != None:
|
if 'error' in response and response['error'] is not None:
|
||||||
return "Error"
|
return "Error"
|
||||||
|
|
||||||
# return response
|
# return response
|
||||||
@@ -967,7 +967,7 @@ def getPendingReveals(account):
|
|||||||
if bid['name'] == domain['name']:
|
if bid['name'] == domain['name']:
|
||||||
state_found = False
|
state_found = False
|
||||||
for reveal in reveals:
|
for reveal in reveals:
|
||||||
if reveal['own'] == True:
|
if reveal['own']:
|
||||||
if bid['value'] == reveal['value']:
|
if bid['value'] == reveal['value']:
|
||||||
state_found = True
|
state_found = True
|
||||||
|
|
||||||
@@ -997,8 +997,8 @@ def getPendingRedeems(account, password):
|
|||||||
pending.append(nameHash)
|
pending.append(nameHash)
|
||||||
else:
|
else:
|
||||||
pending.append(name['result'])
|
pending.append(name['result'])
|
||||||
except:
|
except Exception as e:
|
||||||
print("Failed to parse redeems")
|
print(f"Failed to parse redeems: {str(e)}")
|
||||||
|
|
||||||
return pending
|
return pending
|
||||||
|
|
||||||
@@ -1008,7 +1008,7 @@ def getPendingRegisters(account):
|
|||||||
domains = getDomains(account, False)
|
domains = getDomains(account, False)
|
||||||
pending = []
|
pending = []
|
||||||
for domain in domains:
|
for domain in domains:
|
||||||
if domain['state'] == "CLOSED" and domain['registered'] == False:
|
if domain['state'] == "CLOSED" and not domain['registered']:
|
||||||
for bid in bids:
|
for bid in bids:
|
||||||
if bid['name'] == domain['name']:
|
if bid['name'] == domain['name']:
|
||||||
if bid['value'] == domain['highest']:
|
if bid['value'] == domain['highest']:
|
||||||
@@ -1026,9 +1026,9 @@ def getPendingFinalizes(account, password):
|
|||||||
pending = []
|
pending = []
|
||||||
try:
|
try:
|
||||||
for output in tx['outputs']:
|
for output in tx['outputs']:
|
||||||
if type(output) != dict:
|
if type(output) is not dict:
|
||||||
continue
|
continue
|
||||||
if not 'covenant' in output:
|
if 'covenant' not in output:
|
||||||
continue
|
continue
|
||||||
if output['covenant'].get("type") != 10:
|
if output['covenant'].get("type") != 10:
|
||||||
continue
|
continue
|
||||||
@@ -1041,8 +1041,8 @@ def getPendingFinalizes(account, password):
|
|||||||
pending.append(nameHash)
|
pending.append(nameHash)
|
||||||
else:
|
else:
|
||||||
pending.append(name['result'])
|
pending.append(name['result'])
|
||||||
except:
|
except Exception as e:
|
||||||
print("Failed to parse finalizes")
|
print(f"Failed to parse finalizes: {str(e)}")
|
||||||
return pending
|
return pending
|
||||||
|
|
||||||
|
|
||||||
@@ -1065,7 +1065,7 @@ def revealAuction(account, domain):
|
|||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
password = ":".join(account.split(":")[1:])
|
password = ":".join(account.split(":")[1:])
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -1085,7 +1085,7 @@ def revealAll(account):
|
|||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
password = ":".join(account.split(":")[1:])
|
password = ":".join(account.split(":")[1:])
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -1119,7 +1119,7 @@ def redeemAll(account):
|
|||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
password = ":".join(account.split(":")[1:])
|
password = ":".join(account.split(":")[1:])
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -1151,9 +1151,8 @@ def redeemAll(account):
|
|||||||
|
|
||||||
def registerAll(account):
|
def registerAll(account):
|
||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
password = ":".join(account.split(":")[1:])
|
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -1176,9 +1175,8 @@ def registerAll(account):
|
|||||||
|
|
||||||
def finalizeAll(account):
|
def finalizeAll(account):
|
||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
password = ":".join(account.split(":")[1:])
|
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -1211,7 +1209,7 @@ def bid(account, domain, bid, blind):
|
|||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
password = ":".join(account.split(":")[1:])
|
password = ":".join(account.split(":")[1:])
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -1236,7 +1234,7 @@ def openAuction(account, domain):
|
|||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
password = ":".join(account.split(":")[1:])
|
password = ":".join(account.split(":")[1:])
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -1258,7 +1256,7 @@ def transfer(account, domain, address):
|
|||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
password = ":".join(account.split(":")[1:])
|
password = ":".join(account.split(":")[1:])
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -1280,7 +1278,7 @@ def finalize(account, domain):
|
|||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
password = ":".join(account.split(":")[1:])
|
password = ":".join(account.split(":")[1:])
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -1317,7 +1315,7 @@ def cancelTransfer(account, domain):
|
|||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
password = ":".join(account.split(":")[1:])
|
password = ":".join(account.split(":")[1:])
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -1354,7 +1352,7 @@ def revoke(account, domain):
|
|||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
password = ":".join(account.split(":")[1:])
|
password = ":".join(account.split(":")[1:])
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -1391,7 +1389,7 @@ def sendBatch(account, batch):
|
|||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
password = ":".join(account.split(":")[1:])
|
password = ":".join(account.split(":")[1:])
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -1440,7 +1438,7 @@ def createBatch(account, batch):
|
|||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
password = ":".join(account.split(":")[1:])
|
password = ":".join(account.split(":")[1:])
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -1589,7 +1587,7 @@ def zapTXs(account):
|
|||||||
|
|
||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -1615,7 +1613,7 @@ def getxPub(account):
|
|||||||
if account.count(":") > 0:
|
if account.count(":") > 0:
|
||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -1643,7 +1641,7 @@ def signMessage(account, domain, message):
|
|||||||
account_name = check_account(account)
|
account_name = check_account(account)
|
||||||
password = ":".join(account.split(":")[1:])
|
password = ":".join(account.split(":")[1:])
|
||||||
|
|
||||||
if account_name == False:
|
if not account_name:
|
||||||
return {
|
return {
|
||||||
"error": {
|
"error": {
|
||||||
"message": "Invalid account"
|
"message": "Invalid account"
|
||||||
@@ -1683,6 +1681,7 @@ def verifyMessageWithName(domain, signature, message):
|
|||||||
return response['result']
|
return response['result']
|
||||||
return False
|
return False
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
print(f"Error verifying message with name: {str(e)}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
@@ -1693,6 +1692,7 @@ def verifyMessage(address, signature, message):
|
|||||||
return response['result']
|
return response['result']
|
||||||
return False
|
return False
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
print(f"Error verifying message: {str(e)}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# endregion
|
# endregion
|
||||||
@@ -1739,7 +1739,7 @@ def get_node_api_url(path=''):
|
|||||||
base_url = f"http://x:{HSD_API}@{HSD_IP}:{HSD_NODE_PORT}"
|
base_url = f"http://x:{HSD_API}@{HSD_IP}:{HSD_NODE_PORT}"
|
||||||
if isSPV() and any(path.startswith(route) for route in SPV_EXTERNAL_ROUTES):
|
if isSPV() and any(path.startswith(route) for route in SPV_EXTERNAL_ROUTES):
|
||||||
# If in SPV mode and the path is one of the external routes, use the external API
|
# If in SPV mode and the path is one of the external routes, use the external API
|
||||||
base_url = f"https://hsd.hns.au/api/v1"
|
base_url = "https://hsd.hns.au/api/v1"
|
||||||
|
|
||||||
if path:
|
if path:
|
||||||
# Ensure path starts with a slash if it's not empty
|
# Ensure path starts with a slash if it's not empty
|
||||||
@@ -1945,7 +1945,8 @@ def hsdStart():
|
|||||||
try:
|
try:
|
||||||
signal.signal(signal.SIGINT, lambda s, f: (hsdStop(), sys.exit(0)))
|
signal.signal(signal.SIGINT, lambda s, f: (hsdStop(), sys.exit(0)))
|
||||||
signal.signal(signal.SIGTERM, lambda s, f: (hsdStop(), sys.exit(0)))
|
signal.signal(signal.SIGTERM, lambda s, f: (hsdStop(), sys.exit(0)))
|
||||||
except:
|
except Exception as e:
|
||||||
|
print(f"Failed to set signal handlers: {str(e)}")
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import dns.query
|
|||||||
import dns.rdatatype
|
import dns.rdatatype
|
||||||
import httpx
|
import httpx
|
||||||
from requests_doh import DNSOverHTTPSSession, add_dns_provider
|
from requests_doh import DNSOverHTTPSSession, add_dns_provider
|
||||||
import requests
|
|
||||||
import urllib3
|
import urllib3
|
||||||
from cryptography.x509.oid import ExtensionOID
|
from cryptography.x509.oid import ExtensionOID
|
||||||
|
|
||||||
@@ -172,11 +171,11 @@ def resolve_TLSA_with_doh(query_name, doh_url="https://hnsdoh.com/dns-query"):
|
|||||||
def emoji_to_punycode(emoji):
|
def emoji_to_punycode(emoji):
|
||||||
try:
|
try:
|
||||||
return emoji.encode("idna").decode("ascii")
|
return emoji.encode("idna").decode("ascii")
|
||||||
except Exception as e:
|
except Exception:
|
||||||
return emoji
|
return emoji
|
||||||
|
|
||||||
def punycode_to_emoji(punycode):
|
def punycode_to_emoji(punycode):
|
||||||
try:
|
try:
|
||||||
return punycode.encode("ascii").decode("idna")
|
return punycode.encode("ascii").decode("idna")
|
||||||
except Exception as e:
|
except Exception:
|
||||||
return punycode
|
return punycode
|
||||||
32
main.py
32
main.py
@@ -12,11 +12,9 @@ import re
|
|||||||
from flask_qrcode import QRcode
|
from flask_qrcode import QRcode
|
||||||
import domainLookup
|
import domainLookup
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
import importlib
|
|
||||||
import plugin as plugins_module
|
import plugin as plugins_module
|
||||||
import gitinfo
|
import gitinfo
|
||||||
import datetime
|
import datetime
|
||||||
import functools
|
|
||||||
import time
|
import time
|
||||||
|
|
||||||
dotenv.load_dotenv()
|
dotenv.load_dotenv()
|
||||||
@@ -196,7 +194,7 @@ def send():
|
|||||||
content = f"Are you sure you want to send {amount} HNS to {toAddress}<br><br>"
|
content = f"Are you sure you want to send {amount} HNS to {toAddress}<br><br>"
|
||||||
content += f"This will cost {amount} HNS + mining fees and is not able to be undone."
|
content += f"This will cost {amount} HNS + mining fees and is not able to be undone."
|
||||||
|
|
||||||
cancel = f"/send"
|
cancel = "/send"
|
||||||
confirm = f"/send/confirm?address={address}&amount={amount}"
|
confirm = f"/send/confirm?address={address}&amount={amount}"
|
||||||
|
|
||||||
|
|
||||||
@@ -645,9 +643,9 @@ def revokeInit(domain: str):
|
|||||||
domain = domain.lower()
|
domain = domain.lower()
|
||||||
|
|
||||||
content = f"Are you sure you want to revoke {domain}/?<br>"
|
content = f"Are you sure you want to revoke {domain}/?<br>"
|
||||||
content += f"This will return the domain to the auction pool and you will lose any funds spent on the domain.<br>"
|
content += "This will return the domain to the auction pool and you will lose any funds spent on the domain.<br>"
|
||||||
content += f"This cannot be undone after the transaction is sent.<br><br>"
|
content += "This cannot be undone after the transaction is sent.<br><br>"
|
||||||
content += f"Please enter your password to confirm."
|
content += "Please enter your password to confirm."
|
||||||
|
|
||||||
cancel = f"/manage/{domain}"
|
cancel = f"/manage/{domain}"
|
||||||
confirm = f"/manage/{domain}/revoke/confirm"
|
confirm = f"/manage/{domain}/revoke/confirm"
|
||||||
@@ -820,7 +818,7 @@ def transfer(domain):
|
|||||||
|
|
||||||
action = f"Send {domain}/ to {request.form.get('address')}"
|
action = f"Send {domain}/ to {request.form.get('address')}"
|
||||||
content = f"Are you sure you want to send {domain}/ to {toAddress}<br><br>"
|
content = f"Are you sure you want to send {domain}/ to {toAddress}<br><br>"
|
||||||
content += f"This requires sending a finalize transaction 2 days after the transfer is initiated."
|
content += "This requires sending a finalize transaction 2 days after the transfer is initiated."
|
||||||
|
|
||||||
cancel = f"/manage/{domain}?address={address}"
|
cancel = f"/manage/{domain}?address={address}"
|
||||||
confirm = f"/manage/{domain}/transfer/confirm?address={address}"
|
confirm = f"/manage/{domain}/transfer/confirm?address={address}"
|
||||||
@@ -918,7 +916,7 @@ def auction(domain):
|
|||||||
if domainInfo['info'] is None:
|
if domainInfo['info'] is None:
|
||||||
if 'registered' in domainInfo and domainInfo['registered'] == False and 'expired' in domainInfo and domainInfo['expired'] == False:
|
if 'registered' in domainInfo and domainInfo['registered'] == False and 'expired' in domainInfo and domainInfo['expired'] == False:
|
||||||
# Needs to be registered
|
# Needs to be registered
|
||||||
next_action = f'ERROR GETTING NEXT STATE'
|
next_action = 'ERROR GETTING NEXT STATE'
|
||||||
else:
|
else:
|
||||||
next_action = f'<a href="/auction/{domain}/open">Open Auction</a>'
|
next_action = f'<a href="/auction/{domain}/open">Open Auction</a>'
|
||||||
return render_template("auction.html", account=account,
|
return render_template("auction.html", account=account,
|
||||||
@@ -965,7 +963,7 @@ def auction(domain):
|
|||||||
elif stats['blocksUntilReveal'] == 2:
|
elif stats['blocksUntilReveal'] == 2:
|
||||||
next += "<br>LAST CHANCE TO BID"
|
next += "<br>LAST CHANCE TO BID"
|
||||||
elif stats['blocksUntilReveal'] == 3:
|
elif stats['blocksUntilReveal'] == 3:
|
||||||
next += f"<br>Next block is last chance to bid"
|
next += "<br>Next block is last chance to bid"
|
||||||
elif stats['blocksUntilReveal'] < 6:
|
elif stats['blocksUntilReveal'] < 6:
|
||||||
next += f"<br>Last chance to bid in {stats['blocksUntilReveal']-2} blocks"
|
next += f"<br>Last chance to bid in {stats['blocksUntilReveal']-2} blocks"
|
||||||
|
|
||||||
@@ -1229,7 +1227,7 @@ def settings_action(action):
|
|||||||
|
|
||||||
@app.route('/settings/upload', methods=['POST'])
|
@app.route('/settings/upload', methods=['POST'])
|
||||||
def upload_image():
|
def upload_image():
|
||||||
if not 'account' in request.cookies:
|
if 'account' not in request.cookies:
|
||||||
return redirect("/login?message=Not logged in")
|
return redirect("/login?message=Not logged in")
|
||||||
|
|
||||||
account = request.cookies.get("account")
|
account = request.cookies.get("account")
|
||||||
@@ -1253,7 +1251,7 @@ def upload_image():
|
|||||||
return redirect("/settings?error=An error occurred")
|
return redirect("/settings?error=An error occurred")
|
||||||
|
|
||||||
def latestVersion(branch):
|
def latestVersion(branch):
|
||||||
result = requests.get(f"https://git.woodburn.au/api/v1/repos/nathanwoodburn/firewalletbrowser/branches")
|
result = requests.get("https://git.woodburn.au/api/v1/repos/nathanwoodburn/firewalletbrowser/branches")
|
||||||
if result.status_code != 200:
|
if result.status_code != 200:
|
||||||
return "Error"
|
return "Error"
|
||||||
|
|
||||||
@@ -1628,7 +1626,7 @@ def api_hsd(function):
|
|||||||
elif stats['blocksUntilReveal'] == 2:
|
elif stats['blocksUntilReveal'] == 2:
|
||||||
next += "<br>LAST CHANCE TO BID"
|
next += "<br>LAST CHANCE TO BID"
|
||||||
elif stats['blocksUntilReveal'] == 3:
|
elif stats['blocksUntilReveal'] == 3:
|
||||||
next += f"<br>Next block is last chance to bid"
|
next += "<br>Next block is last chance to bid"
|
||||||
elif stats['blocksUntilReveal'] < 6:
|
elif stats['blocksUntilReveal'] < 6:
|
||||||
next += f"<br>Last chance to bid in {stats['blocksUntilReveal']-2} blocks"
|
next += f"<br>Last chance to bid in {stats['blocksUntilReveal']-2} blocks"
|
||||||
|
|
||||||
@@ -1783,9 +1781,9 @@ def api_wallet(function):
|
|||||||
|
|
||||||
if function == "icon":
|
if function == "icon":
|
||||||
# Check if there is an icon
|
# Check if there is an icon
|
||||||
if not os.path.exists(f'user_data/images'):
|
if not os.path.exists('user_data/images'):
|
||||||
return send_file('templates/assets/img/HNS.png')
|
return send_file('templates/assets/img/HNS.png')
|
||||||
files = os.listdir(f'user_data/images')
|
files = os.listdir('user_data/images')
|
||||||
for file in files:
|
for file in files:
|
||||||
if file.startswith(account):
|
if file.startswith(account):
|
||||||
return send_file(f'user_data/images/{file}')
|
return send_file(f'user_data/images/{file}')
|
||||||
@@ -1820,9 +1818,9 @@ def api_wallet_mobile(function):
|
|||||||
|
|
||||||
@app.route('/api/v1/icon/<account>')
|
@app.route('/api/v1/icon/<account>')
|
||||||
def api_icon(account):
|
def api_icon(account):
|
||||||
if not os.path.exists(f'user_data/images'):
|
if not os.path.exists('user_data/images'):
|
||||||
return send_file('templates/assets/img/HNS.png')
|
return send_file('templates/assets/img/HNS.png')
|
||||||
files = os.listdir(f'user_data/images')
|
files = os.listdir('user_data/images')
|
||||||
for file in files:
|
for file in files:
|
||||||
if file.startswith(account):
|
if file.startswith(account):
|
||||||
return send_file(f'user_data/images/{file}')
|
return send_file(f'user_data/images/{file}')
|
||||||
@@ -1854,7 +1852,7 @@ def renderDomain(name: str) -> str:
|
|||||||
return f"{rendered}/ ({name})"
|
return f"{rendered}/ ({name})"
|
||||||
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception:
|
||||||
return f"{name}/"
|
return f"{name}/"
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import json
|
|
||||||
import account
|
import account
|
||||||
import requests
|
import requests
|
||||||
import threading
|
import threading
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
import json
|
|
||||||
import account
|
import account
|
||||||
import requests
|
import requests
|
||||||
import os
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import json
|
import json
|
||||||
import account
|
|
||||||
import requests
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
# Plugin Data
|
# Plugin Data
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
import json
|
|
||||||
import account
|
import account
|
||||||
import requests
|
import requests
|
||||||
import os
|
|
||||||
|
|
||||||
# Plugin Data
|
# Plugin Data
|
||||||
info = {
|
info = {
|
||||||
|
|||||||
46
render.py
46
render.py
@@ -2,9 +2,7 @@ import datetime
|
|||||||
import json
|
import json
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
from flask import render_template
|
from flask import render_template
|
||||||
from domainLookup import punycode_to_emoji
|
|
||||||
import os
|
import os
|
||||||
from handywrapper import api
|
|
||||||
import threading
|
import threading
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
@@ -182,7 +180,7 @@ def transactions(txs):
|
|||||||
elif amount > 0:
|
elif amount > 0:
|
||||||
amount = f"<span style='color: green;'>+{amount:,.2f}</span>"
|
amount = f"<span style='color: green;'>+{amount:,.2f}</span>"
|
||||||
else:
|
else:
|
||||||
amount = f"<span style='color: gray;'>0.00</span>"
|
amount = "<span style='color: gray;'>0.00</span>"
|
||||||
|
|
||||||
|
|
||||||
# hash = f"<a target='_blank' href='{TX_EXPLORER_URL}{hash}'>{hash[:8]}...</a>"
|
# hash = f"<a target='_blank' href='{TX_EXPLORER_URL}{hash}'>{hash[:8]}...</a>"
|
||||||
@@ -261,7 +259,7 @@ def txs(data):
|
|||||||
html_output += f"<td>{amount:,.2f} + {blind:,.2f} HNS</td>\n"
|
html_output += f"<td>{amount:,.2f} + {blind:,.2f} HNS</td>\n"
|
||||||
|
|
||||||
html_output += f"<td>{timestamp_to_readable_time(entry['time'])}</td>\n"
|
html_output += f"<td>{timestamp_to_readable_time(entry['time'])}</td>\n"
|
||||||
html_output += f"</tr>\n"
|
html_output += "</tr>\n"
|
||||||
|
|
||||||
return html_output
|
return html_output
|
||||||
|
|
||||||
@@ -316,13 +314,13 @@ def bids(bids,reveals):
|
|||||||
html += f"<td>{value:,.2f} HNS</td>"
|
html += f"<td>{value:,.2f} HNS</td>"
|
||||||
html += f"<td>{bidValue:,.2f} HNS</td>"
|
html += f"<td>{bidValue:,.2f} HNS</td>"
|
||||||
else:
|
else:
|
||||||
html += f"<td>Hidden until reveal</td>"
|
html += "<td>Hidden until reveal</td>"
|
||||||
html += f"<td>Hidden until reveal</td>"
|
html += "<td>Hidden until reveal</td>"
|
||||||
|
|
||||||
if bid['own']:
|
if bid['own']:
|
||||||
html += "<td>You</td>"
|
html += "<td>You</td>"
|
||||||
else:
|
else:
|
||||||
html += f"<td>Unknown</td>"
|
html += "<td>Unknown</td>"
|
||||||
|
|
||||||
html += f"<td><a class='text-decoration-none' style='color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));' target='_blank' href='{TX_EXPLORER_URL}{bid['prevout']['hash']}'>Bid TX 🔗</a></td>"
|
html += f"<td><a class='text-decoration-none' style='color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));' target='_blank' href='{TX_EXPLORER_URL}{bid['prevout']['hash']}'>Bid TX 🔗</a></td>"
|
||||||
html += "</tr>"
|
html += "</tr>"
|
||||||
@@ -410,22 +408,22 @@ def plugin_functions(functions, pluginName):
|
|||||||
functionType = functions[function]["type"]
|
functionType = functions[function]["type"]
|
||||||
|
|
||||||
|
|
||||||
html += f'<div class="card" style="margin-top: 50px;">'
|
html += '<div class="card" style="margin-top: 50px;">'
|
||||||
html += f'<div class="card-body">'
|
html += '<div class="card-body">'
|
||||||
html += f'<h4 class="card-title">{name}</h4>'
|
html += f'<h4 class="card-title">{name}</h4>'
|
||||||
html += f'<h6 class="text-muted card-subtitle mb-2">{description}</h6>'
|
html += f'<h6 class="text-muted card-subtitle mb-2">{description}</h6>'
|
||||||
html += f'<h6 class="text-muted card-subtitle mb-2">Function type: {functionType.capitalize()}</h6>'
|
html += f'<h6 class="text-muted card-subtitle mb-2">Function type: {functionType.capitalize()}</h6>'
|
||||||
|
|
||||||
if functionType != "default":
|
if functionType != "default":
|
||||||
html += f'<p class="card-text">Returns: {returns}</p>'
|
html += f'<p class="card-text">Returns: {returns}</p>'
|
||||||
html += f'</div>'
|
html += '</div>'
|
||||||
html += f'</div>'
|
html += '</div>'
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Form
|
# Form
|
||||||
html += f'<form method="post" style="padding: 20px;" action="/plugin/{pluginName}/{function}">'
|
html += f'<form method="post" style="padding: 20px;" action="/plugin/{pluginName}/{function}">'
|
||||||
for param in params:
|
for param in params:
|
||||||
html += f'<div style="margin-bottom: 20px;">'
|
html += '<div style="margin-bottom: 20px;">'
|
||||||
paramName = params[param]["name"]
|
paramName = params[param]["name"]
|
||||||
paramType = params[param]["type"]
|
paramType = params[param]["type"]
|
||||||
if paramType == "text":
|
if paramType == "text":
|
||||||
@@ -449,14 +447,14 @@ def plugin_functions(functions, pluginName):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
html += f'</div>'
|
html += '</div>'
|
||||||
|
|
||||||
html += f'<button type="submit" class="btn btn-primary">Submit</button>'
|
html += '<button type="submit" class="btn btn-primary">Submit</button>'
|
||||||
html += f'</form>'
|
html += '</form>'
|
||||||
# For debugging
|
# For debugging
|
||||||
html += f'<p class="card-text">Returns: {returns}</p>'
|
html += f'<p class="card-text">Returns: {returns}</p>'
|
||||||
html += f'</div>'
|
html += '</div>'
|
||||||
html += f'</div>'
|
html += '</div>'
|
||||||
|
|
||||||
|
|
||||||
return html
|
return html
|
||||||
@@ -468,16 +466,16 @@ def plugin_output(outputs, returns):
|
|||||||
for returnOutput in returns:
|
for returnOutput in returns:
|
||||||
if returnOutput not in outputs:
|
if returnOutput not in outputs:
|
||||||
continue
|
continue
|
||||||
html += f'<div class="card" style="margin-top: 50px; margin-bottom: 50px;">'
|
html += '<div class="card" style="margin-top: 50px; margin-bottom: 50px;">'
|
||||||
html += f'<div class="card-body">'
|
html += '<div class="card-body">'
|
||||||
html += f'<h4 class="card-title">{returns[returnOutput]["name"]}</h4>'
|
html += f'<h4 class="card-title">{returns[returnOutput]["name"]}</h4>'
|
||||||
|
|
||||||
output = outputs[returnOutput]
|
output = outputs[returnOutput]
|
||||||
if returns[returnOutput]["type"] == "list":
|
if returns[returnOutput]["type"] == "list":
|
||||||
html += f'<ul>'
|
html += '<ul>'
|
||||||
for item in output:
|
for item in output:
|
||||||
html += f'<li>{item}</li>'
|
html += f'<li>{item}</li>'
|
||||||
html += f'</ul>'
|
html += '</ul>'
|
||||||
elif returns[returnOutput]["type"] == "text":
|
elif returns[returnOutput]["type"] == "text":
|
||||||
html += f'<p>{output}</p>'
|
html += f'<p>{output}</p>'
|
||||||
elif returns[returnOutput]["type"] == "tx":
|
elif returns[returnOutput]["type"] == "tx":
|
||||||
@@ -487,8 +485,8 @@ def plugin_output(outputs, returns):
|
|||||||
html += render_template('components/dns-output.html', dns=dns(output))
|
html += render_template('components/dns-output.html', dns=dns(output))
|
||||||
|
|
||||||
|
|
||||||
html += f'</div>'
|
html += '</div>'
|
||||||
html += f'</div>'
|
html += '</div>'
|
||||||
return html
|
return html
|
||||||
|
|
||||||
def plugin_output_dash(outputs, returns):
|
def plugin_output_dash(outputs, returns):
|
||||||
@@ -517,7 +515,7 @@ def renderDomain(name: str) -> str:
|
|||||||
return f"{rendered}/ ({name})"
|
return f"{rendered}/ ({name})"
|
||||||
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception:
|
||||||
return f"{name}/"
|
return f"{name}/"
|
||||||
|
|
||||||
def renderDomainAsync(namehash: str) -> None:
|
def renderDomainAsync(namehash: str) -> None:
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import os
|
|
||||||
import sys
|
import sys
|
||||||
import platform
|
import platform
|
||||||
from main import app
|
from main import app
|
||||||
@@ -39,6 +38,6 @@ if __name__ == '__main__':
|
|||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
print(f'Starting server with Waitress on {platform.system()} with {threads} threads...', flush=True)
|
print(f'Starting server with Waitress on {platform.system()} with {threads} threads...', flush=True)
|
||||||
print(f'Press Ctrl+C to stop the server', flush=True)
|
print('Press Ctrl+C to stop the server', flush=True)
|
||||||
print(f'Serving on http://0.0.0.0:5000/', flush=True)
|
print('Serving on http://0.0.0.0:5000/', flush=True)
|
||||||
serve(app, host="0.0.0.0", port=5000, threads=threads)
|
serve(app, host="0.0.0.0", port=5000, threads=threads)
|
||||||
|
|||||||
Reference in New Issue
Block a user