diff --git a/api/nostr.py b/api/nostr.py index dbc97b6f7..472fb1aff 100644 --- a/api/nostr.py +++ b/api/nostr.py @@ -1,7 +1,9 @@ import pygeohash import hashlib import uuid -from nostr_sdk import Keys, Client, EventBuilder, NostrSigner + +from asgiref.sync import sync_to_async +from nostr_sdk import Keys, Client, EventBuilder, NostrSigner, Kind, Tag from api.models import Order from decouple import config @@ -26,38 +28,56 @@ async def send_order_event(self, order): await client.add_relays(["ws://localhost:7777"]) await client.connect() - event = EventBuilder(38383, "", self.generate_tags(order)).to_event(keys) - event.custom_created_at(order.created_at.timestamp()) + robot_name = await self.get_robot_name(order) + currency = await self.get_robot_currency(order) + + event = ( + EventBuilder( + Kind(38383), + "", + Tag.parse(self.generate_tags(order, robot_name, currency)), + ) + .custom_created_at(order.created_at.timestamp()) + .to_event(keys) + ) output = await client.send_event(event) print(f"Nostr event sent: {output}") - def generate_tags(self, order): + @sync_to_async + def get_robot_name(self, order): + return order.maker.username + + @sync_to_async + def get_robot_currency(self, order): + return str(order.currency) + + def generate_tags(self, order, robot_name, currency): hashed_id = hashlib.md5( f"{config("COORDINATOR_ALIAS", cast=str)}{order.id}".encode("utf-8") ).hexdigest() tags = [ - ["d", uuid.UUID(hashed_id)], - ["name", order.maker.robot_name], - ["k", order.type.lower()], - ["f", order.currency], + ["d", str(uuid.UUID(hashed_id))], + ["name", robot_name], + ["k", "sell" if order.type == Order.Types.SELL else "buy"], + ["f", currency], ["s", self.get_status_tag(order)], ["amt", "0"], - ["fa", order.amount], - ["pm", order.payment_method.split(" ")], - ["premium", order.premium_percentile * 100], + ["fa", str(order.amount)], + ["pm"] + order.payment_method.split(" "), + ["premium", str(order.premium)], [ "source", - f"{config("HOST_NAME")}/{config("COORDINATOR_ALIAS")}/order/{order.id}", + f"http://{config("HOST_NAME")}/{config("COORDINATOR_ALIAS")}/order/{order.id}", ], - ["expiration", order.expires_at.timestamp()], + ["expiration", int(order.expires_at.timestamp())], ["y", "robosats", config("COORDINATOR_ALIAS", cast=str)], - ["n", order.network], - ["layer", self.get_layer_tag(order)], - ["bond", order.bond], + ["n", str(config("NETWORK"))], + ["layer"] + self.get_layer_tag(order), + ["bond", str(order.bond_size)], ["z", "order"], ] - + print(tags) if order.latitude and order.longitude: tags.extend([["g", pygeohash.encode(order.latitude, order.longitude)]]) diff --git a/api/tasks.py b/api/tasks.py index 824bd9e69..416a58475 100644 --- a/api/tasks.py +++ b/api/tasks.py @@ -1,4 +1,4 @@ -import asyncio +from asgiref.sync import async_to_sync from celery import shared_task from celery.exceptions import SoftTimeLimitExceeded @@ -261,7 +261,7 @@ def nostr_send_order_event(order_id=None): order = Order.objects.get(id=order_id) nostr = Nostr() - asyncio.run(nostr.send_order_event(order)) + async_to_sync(nostr.send_order_event)(order) return diff --git a/requirements.txt b/requirements.txt index 92f1f8a4c..51334cc34 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,3 +30,4 @@ django-cors-headers==4.4.0 base91==1.0.1 nostr-sdk==0.32.2 pygeohash==1.2.0 +asgiref == 3.8.1 diff --git a/tests/utils/trade.py b/tests/utils/trade.py index c6303b0ad..39bcda0a1 100644 --- a/tests/utils/trade.py +++ b/tests/utils/trade.py @@ -5,7 +5,7 @@ from api.management.commands.clean_orders import Command as CleanOrders from api.management.commands.follow_invoices import Command as FollowInvoices from api.models import Order -from api.tasks import follow_send_payment, send_notification, nostr_send_order_event +from api.tasks import follow_send_payment, send_notification from tests.utils.node import ( add_invoice, create_address, @@ -156,7 +156,6 @@ def process_payouts(self, mine_a_block=False): wait_nodes_sync() @patch("api.tasks.send_notification.delay", send_notification) - @patch("api.tasks.nostr_send_order_event.delay", nostr_send_order_event) def publish_order(self): # Maker's first order fetch. Should trigger maker bond hold invoice generation. self.get_order()