From 9465347669d9c0c17c86ccd60344683afcb03e16 Mon Sep 17 00:00:00 2001 From: benarc Date: Fri, 3 Dec 2021 10:50:17 +0000 Subject: [PATCH] Added listener, need to check wallet id agianst lnurlpayouts --- lnbits/extensions/lnurlpayout/__init__.py | 10 +++- lnbits/extensions/lnurlpayout/tasks.py | 60 +++++++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 lnbits/extensions/lnurlpayout/tasks.py diff --git a/lnbits/extensions/lnurlpayout/__init__.py b/lnbits/extensions/lnurlpayout/__init__.py index e40549dde..ad14dd370 100644 --- a/lnbits/extensions/lnurlpayout/__init__.py +++ b/lnbits/extensions/lnurlpayout/__init__.py @@ -1,7 +1,9 @@ +import asyncio from fastapi import APIRouter from lnbits.db import Database from lnbits.helpers import template_renderer +from lnbits.tasks import catch_everything_and_restart db = Database("ext_lnurlpayout") @@ -11,6 +13,10 @@ lnurlpayout_ext: APIRouter = APIRouter(prefix="/lnurlpayout", tags=["lnurlpayout def lnurlpayout_renderer(): return template_renderer(["lnbits/extensions/lnurlpayout/templates"]) - -from .views_api import * # noqa +from .tasks import wait_for_paid_invoices from .views import * # noqa +from .views_api import * # noqa + +def lnurlpayout_start(): + loop = asyncio.get_event_loop() + loop.create_task(catch_everything_and_restart(wait_for_paid_invoices)) diff --git a/lnbits/extensions/lnurlpayout/tasks.py b/lnbits/extensions/lnurlpayout/tasks.py new file mode 100644 index 000000000..c977d1f5d --- /dev/null +++ b/lnbits/extensions/lnurlpayout/tasks.py @@ -0,0 +1,60 @@ +import asyncio +import json +import httpx + +from lnbits.core import db as core_db +from lnbits.core.models import Payment +from lnbits.tasks import register_invoice_listener + +from .crud import get_lnurlpayout + + +async def wait_for_paid_invoices(): + invoice_queue = asyncio.Queue() + register_invoice_listener(invoice_queue) + + while True: + payment = await invoice_queue.get() + await on_invoice_paid(payment) + + +async def on_invoice_paid(payment: Payment) -> None: + print(payment) + if "lnurlpayout" != payment.extra.get("tag"): + # not an lnurlpayout invoice + return + + if payment.extra.get("wh_status"): + # this webhook has already been sent + return + + pay_link = await get_lnurlpayout(payment.extra.get("link", -1)) + if pay_link and pay_link.webhook_url: + async with httpx.AsyncClient() as client: + try: + r = await client.post( + pay_link.webhook_url, + json={ + "payment_hash": payment.payment_hash, + "payment_request": payment.bolt11, + "amount": payment.amount, + "comment": payment.extra.get("comment"), + "lnurlp": pay_link.id, + }, + timeout=40, + ) + await mark_webhook_sent(payment, r.status_code) + except (httpx.ConnectError, httpx.RequestError): + await mark_webhook_sent(payment, -1) + + +async def mark_webhook_sent(payment: Payment, status: int) -> None: + payment.extra["wh_status"] = status + + await core_db.execute( + """ + UPDATE apipayments SET extra = ? + WHERE hash = ? + """, + (json.dumps(payment.extra), payment.payment_hash), + )