mirror of https://github.com/lukechilds/lnbits.git
7 changed files with 92 additions and 76 deletions
@ -0,0 +1,33 @@ |
|||
import asyncio |
|||
from typing import Optional, Awaitable |
|||
from quart import Quart, Request, g |
|||
from werkzeug.datastructures import Headers |
|||
|
|||
from lnbits.db import open_db |
|||
|
|||
main_app: Optional[Quart] = None |
|||
|
|||
|
|||
def grab_app_for_later(state): |
|||
global main_app |
|||
main_app = state.app |
|||
|
|||
|
|||
def run_on_pseudo_request(awaitable: Awaitable): |
|||
async def run(awaitable): |
|||
fk = Request( |
|||
"GET", |
|||
"http", |
|||
"/background/pseudo", |
|||
b"", |
|||
Headers([("host", "lnbits.background")]), |
|||
"", |
|||
"1.1", |
|||
send_push_promise=lambda x, h: None, |
|||
) |
|||
async with main_app.request_context(fk): |
|||
g.db = open_db() |
|||
await awaitable |
|||
|
|||
loop = asyncio.get_event_loop() |
|||
loop.create_task(run(awaitable)) |
@ -1,66 +0,0 @@ |
|||
import requests |
|||
|
|||
from quart import abort, redirect, request, url_for |
|||
from http import HTTPStatus |
|||
from time import sleep |
|||
from lnurl import LnurlWithdrawResponse, handle as handle_lnurl # type: ignore |
|||
from lnurl.exceptions import LnurlException # type: ignore |
|||
|
|||
from lnbits import bolt11 |
|||
from lnbits.core import core_app |
|||
from lnbits.settings import WALLET |
|||
|
|||
from ..crud import create_account, get_user, create_wallet, create_payment |
|||
|
|||
|
|||
@core_app.route("/lnurlwallet") |
|||
async def lnurlwallet(): |
|||
memo = "LNbits LNURL funding" |
|||
|
|||
try: |
|||
withdraw_res = handle_lnurl(request.args.get("lightning")) |
|||
if not withdraw_res.ok: |
|||
abort(HTTPStatus.BAD_REQUEST, f"Could not process LNURL-withdraw: {withdraw_res.error_msg}") |
|||
if not isinstance(withdraw_res, LnurlWithdrawResponse): |
|||
abort(HTTPStatus.BAD_REQUEST, "Not a valid LNURL-withdraw.") |
|||
except LnurlException: |
|||
abort(HTTPStatus.INTERNAL_SERVER_ERROR, "Could not process LNURL-withdraw.") |
|||
|
|||
try: |
|||
ok, checking_id, payment_request, error_message = WALLET.create_invoice(withdraw_res.max_sats, memo) |
|||
except Exception as e: |
|||
ok, error_message = False, str(e) |
|||
|
|||
if not ok: |
|||
abort(HTTPStatus.INTERNAL_SERVER_ERROR, error_message) |
|||
|
|||
r = requests.get( |
|||
withdraw_res.callback.base, |
|||
params={**withdraw_res.callback.query_params, **{"k1": withdraw_res.k1, "pr": payment_request}}, |
|||
) |
|||
|
|||
if not r.ok: |
|||
abort(HTTPStatus.INTERNAL_SERVER_ERROR, "Could not process LNURL-withdraw.") |
|||
|
|||
inv = bolt11.decode(payment_request) |
|||
|
|||
for i in range(10): |
|||
invoice_status = WALLET.get_invoice_status(checking_id) |
|||
sleep(i) |
|||
if not invoice_status.paid: |
|||
continue |
|||
break |
|||
|
|||
user = get_user(create_account().id) |
|||
wallet = create_wallet(user_id=user.id) |
|||
create_payment( |
|||
wallet_id=wallet.id, |
|||
checking_id=checking_id, |
|||
amount=withdraw_res.max_sats * 1000, |
|||
memo=memo, |
|||
pending=invoice_status.pending, |
|||
payment_request=payment_request, |
|||
payment_hash=inv.payment_hash, |
|||
) |
|||
|
|||
return redirect(url_for("core.wallet", usr=user.id, wal=wallet.id)) |
Loading…
Reference in new issue