import os import json import dotenv import requests import time dotenv.load_dotenv() HSD_IP = os.getenv("HSD_IP") HSD_API = os.getenv("HSD_API") if not os.path.exists("data/listings.json"): with open("data/listings.json", "w") as f: f.write("[]") # region Classes class Listing: def __init__(self, **kwargs): self.domain = '' self.price = 0 self.description = '' self.contact = '' self.signature = '' self.updated = -1 for key, value in kwargs.items(): setattr(self, key, value) self.price = int(self.price) # Fix any errors in the data if self.price < 0: self.price = 0 self.description = self.description.replace('\n','') self.description = self.description.replace('\r','') self.description = self.description.strip() self.contact = self.contact.replace('\n','') self.updated = int(time.time()) print(str(self)) def __str__(self): return f"Domain: {self.domain}\nPrice: {self.price}\nDescription: {self.description}\nContact: {self.contact}" def getMessage(self): return str(self).encode('utf-8').hex() def toHTML(self): return f"""

{self.domain}/

{self.price:,} HNS

{self.description}

Contact: {self.contact}

Delete Listing
""" def toJSON(self): return { 'domain': self.domain, 'description': self.description, 'price': self.price, 'contact': self.contact, 'signature': self.signature, 'updated': self.updated } def signed(self): return validate_signature(self.domain,self.signature,self.getMessage()) def txValid(self): # TODO Validate tx is valid return False # endregion def get_listings() -> list[Listing]: with open("data/listings.json", "r") as f: data = json.loads(f.read()) listings = [] for listing in data: listings.append(Listing(**listing)) return listings def search_listings(domain) -> Listing: listings = get_listings() for listing in listings: if listing.domain == domain: return listing return None def remove_listing(domain) -> bool: listings = get_listings() for listing in listings: if listing.domain == domain: listings.remove(listing) saveListings(listings) return True return False def get_listings_rendered() -> str: listings = get_listings() html = "" for listing in listings: html += listing.toHTML() return html def saveListings(listings:list[Listing]): with open("data/listings.json", "w") as f: f.write(json.dumps(listings,default=Listing.toJSON,indent=4)) def add_listing(listing:Listing): # if not listing.txValid(): # return "Invalid tx" if not listing.signed(): return "Not signed" # Remove any listings with the same domain remove_listing(listing.domain) listings = get_listings() listings.append(listing) saveListings(listings) return True def validate_signature(domain,signature,message) -> bool: response = requests.post(f"http://x:{HSD_API}@{HSD_IP}:12037", json={ "method":"verifymessagewithname", "params":[ domain, signature, message ] }) if response.status_code != 200: return False response = response.json() if response['result'] != True: return False return True def validate_buy_tx(domain,tx) -> bool: return False def validate_cancel_signature(domain,signature) -> bool: message = f"FS: {domain}" if (not validate_signature(domain,signature,message)): return False return True