diff --git a/lnurl.py b/lnurl.py index 0f94f54..324cf9e 100644 --- a/lnurl.py +++ b/lnurl.py @@ -77,6 +77,10 @@ async def api_lnurl_callback( if comment: extra["comment"] = (comment,) + nostr = request.query_params.get("nostr") + if nostr: + extra["nostr"] = nostr + if lnaddress and link.username and link.domain: extra["lnaddress"] = f"{link.username}@{link.domain}" @@ -84,7 +88,7 @@ async def api_lnurl_callback( wallet_id=link.wallet, amount=int(amount_received / 1000), memo=link.description, - unhashed_description=link.lnurlpay_metadata.encode(), + unhashed_description=nostr.encode() or link.lnurlpay_metadata.encode(), extra=extra, ) @@ -136,4 +140,8 @@ async def api_lnurl_response(request: Request, link_id, lnaddress=False): if link.comment_chars > 0: params["commentAllowed"] = link.comment_chars + params["allowNostr"] = True + params[ + "nostrPubkey" + ] = "749b4d4dfc6b00a5e6c9a88d8a220c46c069ff8f027dcf312f040475e059554a" # private: de1af06647137d49b2277faa86f96effc94257a7b7efd6f5dcc52bea08a4746b return params diff --git a/tasks.py b/tasks.py index ea01e04..7e7f62b 100644 --- a/tasks.py +++ b/tasks.py @@ -8,8 +8,10 @@ from lnbits.core.crud import update_payment_extra from lnbits.core.models import Payment from lnbits.helpers import get_current_extension_name from lnbits.tasks import register_invoice_listener - +from websocket import WebSocketApp +from lnbits.settings import settings from .crud import get_pay_link +from threading import Thread async def wait_for_paid_invoices(): @@ -63,6 +65,56 @@ async def on_invoice_paid(payment: Payment): payment.payment_hash, -1, False, "Unexpected Error", str(ex) ) + nostr = payment.extra.get("nostr") + if nostr: + from ..nostrclient.nostr.event import Event + from ..nostrclient.nostr.key import PrivateKey, PublicKey + + event_json = json.loads(nostr) + + def get_tag(event_json, tag): + res = [ + event_tag[1] for event_tag in event_json["tags"] if event_tag[0] == tag + ] + return res[0] if res else None + + private_key = PrivateKey( + bytes.fromhex( + "de1af06647137d49b2277faa86f96effc94257a7b7efd6f5dcc52bea08a4746b" + ) + ) + + p_tag = get_tag(event_json, "p") + tags = [] + for t in ["p", "e"]: + tag = get_tag(event_json, t) + if tag: + tags.append([t, tag]) + tags.append(["bolt11", payment.bolt11]) + tags.append(["description", json.dumps(event_json)]) + zap_receipt = Event( + public_key="749b4d4dfc6b00a5e6c9a88d8a220c46c069ff8f027dcf312f040475e059554a", + kind=9735, + tags=tags, + ) + private_key.sign_event(zap_receipt) + + print(f"NOSTR STUFF: {event_json}") + print(f"Receipt: {zap_receipt}") + + def send_event(class_obj): + ws.send(zap_receipt.to_message()) + # nonlocal wst + # wst.join(timeout=1) + + ws = WebSocketApp( + f"wss://localhost:{settings.port}/nostrclient/api/v1/relay", + on_open=send_event, + ) + wst = Thread(target=ws.run_forever) + wst.daemon = True + wst.start() + async def mark_webhook_sent( payment_hash: str, status: int, is_success: bool, reason_phrase="", text=""