diff --git a/tasks.py b/tasks.py index c51b90a..9c01236 100644 --- a/tasks.py +++ b/tasks.py @@ -5,10 +5,13 @@ import bolt11 import httpx +from lnurl import LnurlResponseException +from lnurl import handle as lnurl_handle from lnbits.core.crud import get_standalone_payment from lnbits.core.crud.wallets import get_wallet_for_key from lnbits.core.models import Payment from lnbits.core.services import create_invoice, fee_reserve, pay_invoice +from lnbits.settings import settings from lnbits.tasks import register_invoice_listener from loguru import logger @@ -48,7 +51,6 @@ async def on_invoice_paid(payment: Payment) -> None: memo = ( f"Split payment: {target.percent}% " f"for {target.alias or target.wallet}" - f";{payment.memo};{payment.payment_hash}" ) if "@" in target.wallet or "LNURL" in target.wallet: @@ -99,15 +101,21 @@ async def get_lnurl_invoice( payoraddress, wallet_id, amount_msat, memo ) -> Optional[str]: - from lnbits.core.views.api import api_lnurlscan + # FIX: Convert address to lowercase to support case-insensitive spec + payoraddress = payoraddress.lower() + + try: + data = await lnurl_handle(payoraddress, user_agent=settings.user_agent, timeout=5) + except (LnurlResponseException, Exception) as exc: + logger.error(f"Failed to handle '{payoraddress}'. Error: {exc}") + return None - data = await api_lnurlscan(payoraddress) rounded_amount = floor(amount_msat / 1000) * 1000 async with httpx.AsyncClient() as client: try: r = await client.get( - data["callback"], + data.callback, params={"amount": rounded_amount, "comment": memo}, timeout=5, ) @@ -116,7 +124,7 @@ async def get_lnurl_invoice( r.raise_for_status() except (httpx.ConnectError, httpx.RequestError): logger.error( - f"splitting LNURL failed: Failed to connect to {data['callback']}." + f"splitting LNURL failed: Failed to connect to {data.callback}." ) return None except Exception as exc: @@ -125,7 +133,7 @@ async def get_lnurl_invoice( params = json.loads(r.text) if params.get("status") == "ERROR": - logger.error(f"{data['callback']} said: '{params.get('reason', '')}'") + logger.error(f"{data.callback} said: '{params.get('reason', '')}'") return None invoice = bolt11.decode(params["pr"]) @@ -139,7 +147,7 @@ async def get_lnurl_invoice( if invoice.amount_msat != rounded_amount: logger.error( f""" - {data['callback']} returned an invalid invoice. + {data.callback} returned an invalid invoice. Expected {amount_msat} msat, got {invoice.amount_msat}. """ )