2024-12-19 12:08:20 +01:00

56 lines
2.1 KiB
Python

# nostr.py
import hashlib
import sqlite3
from logs import print_log
from nostr_sdk import Keys, Client, NostrSigner, NostrSdkError
from db import insert_order, max_iteration, exists_iteration, delete_records_by_iteration, update_iteration, db_file_name
async def publish_to_nostr(orders, origin, parser, nsec):
conn = sqlite3.connect(db_file_name)
last_iteration = max_iteration(conn, origin)
print_log(f"Iteration {origin}: {last_iteration + 1}")
# Initialize with coordinator Keys
keys = Keys.parse(nsec)
signer = NostrSigner.keys(keys)
client = Client(signer)
# Add relays and connect
await client.add_relay("ws://localhost")
await client.connect()
print_log(f"Iteration {origin}: Checking Orders")
cursor = conn.cursor()
for order in orders:
identifier = str(order.get('id'))
if exists_iteration(conn, identifier, origin):
# keep alive existing orders
print_log(f"Iteration {origin}: {last_iteration + 1} - Order stay alive: {identifier}")
update_iteration(cursor, identifier, origin, last_iteration + 1)
else:
# Publish new orders
try:
events = parser(order, keys, "pending")
for event in events:
print_log(f"Iteration {origin}: {last_iteration + 1} - Nostr event sent: {event.as_json()}")
try:
await client.send_event(event)
except NostrSdkError as e:
print_log(f"Iteration {origin}: {last_iteration + 1} - Event already published")
if (len(events) > 0):
insert_order(cursor, identifier, str(events[0].created_at().as_secs()), last_iteration + 1, origin)
except Exception as e:
print_log(f"Iteration {origin}: {last_iteration + 1} - Error parsing {e} : {order}")
conn.commit()
print_log(f"Iteration {origin}: Cleaning Orders")
delete_records_by_iteration(conn, last_iteration, origin)
conn.commit()
conn.close()