Websocket/listener working

This commit is contained in:
ben 2022-10-07 13:46:40 +01:00
parent 52dc528a8a
commit 8d4337679f
5 changed files with 30 additions and 22 deletions

View file

@ -22,9 +22,10 @@ async def create_lnurldevice(
wallet, wallet,
currency, currency,
device, device,
profit profit,
amount
) )
VALUES (?, ?, ?, ?, ?, ?, ?) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
""", """,
( (
lnurldevice_id, lnurldevice_id,
@ -34,6 +35,7 @@ async def create_lnurldevice(
data.currency, data.currency,
data.device, data.device,
data.profit, data.profit,
data.amount,
), ),
) )
return await get_lnurldevice(lnurldevice_id) return await get_lnurldevice(lnurldevice_id)

View file

@ -103,9 +103,19 @@ async def lnurl_v1_params(
if paymentcheck: if paymentcheck:
return {"status": "ERROR", "reason": f"Payment already claimed"} return {"status": "ERROR", "reason": f"Payment already claimed"}
if device.device == "switch": if device.device == "switch":
price_msat = (
await fiat_amount_as_satoshis(float(device.profit), device.currency)
if device.currency != "sat"
else amount_in_cent
) * 1000
lnurldevicepayment = await create_lnurldevicepayment( lnurldevicepayment = await create_lnurldevicepayment(
deviceid=device.id, deviceid=device.id,
sats=device.profit, payload="bla",
sats=price_msat,
pin=1,
payhash="bla",
) )
if not lnurldevicepayment: if not lnurldevicepayment:
return {"status": "ERROR", "reason": "Could not create payment."} return {"status": "ERROR", "reason": "Could not create payment."}
@ -114,8 +124,8 @@ async def lnurl_v1_params(
"callback": request.url_for( "callback": request.url_for(
"lnurldevice.lnurl_callback", paymentid=lnurldevicepayment.id "lnurldevice.lnurl_callback", paymentid=lnurldevicepayment.id
), ),
"minSendable": device.profit * 1000, "minSendable": price_msat,
"maxSendable": device.profit * 1000, "maxSendable": price_msat,
"metadata": await device.lnurlpay_metadata(), "metadata": await device.lnurlpay_metadata(),
} }
if len(p) % 4 > 0: if len(p) % 4 > 0:
@ -224,21 +234,15 @@ async def lnurl_callback(
payment_hash, payment_request = await create_invoice( payment_hash, payment_request = await create_invoice(
wallet_id=device.wallet, wallet_id=device.wallet,
amount=lnurldevicepayment.sats / 1000, amount=lnurldevicepayment.sats / 1000,
memo=device.title, memo=device.title + "-" + lnurldevicepayment.id,
unhashed_description=(await device.lnurlpay_metadata()).encode("utf-8"), unhashed_description=(await device.lnurlpay_metadata()).encode("utf-8"),
extra={"tag": "Switch", "id": device.paymentid, "time": device.amount}, extra={"tag": "Switch", "id": paymentid, "time": device.amount},
) )
lnurldevicepayment = await update_lnurldevicepayment( lnurldevicepayment = await update_lnurldevicepayment(
lnurldevicepayment_id=paymentid, payhash=payment_hash lnurldevicepayment_id=paymentid, payhash=payment_hash
) )
return { return {
"pr": payment_request, "pr": payment_request,
"successAction": {
"tag": "url",
"description": "Check the attached link",
"url": request.url_for("lnurldevice.displaypin", paymentid=paymentid),
},
"routes": [], "routes": [],
} }

View file

@ -12,8 +12,9 @@ from lnbits.core.services import pay_invoice
from lnbits.helpers import get_current_extension_name from lnbits.helpers import get_current_extension_name
from lnbits.tasks import register_invoice_listener from lnbits.tasks import register_invoice_listener
from .crud import get_lnurldevice from .crud import get_lnurldevice, get_lnurldevicepayment, update_lnurldevicepayment
from .views import updater from .views import updater
from loguru import logger
async def wait_for_paid_invoices(): async def wait_for_paid_invoices():
invoice_queue = asyncio.Queue() invoice_queue = asyncio.Queue()
@ -23,17 +24,16 @@ async def wait_for_paid_invoices():
payment = await invoice_queue.get() payment = await invoice_queue.get()
await on_invoice_paid(payment) await on_invoice_paid(payment)
async def on_invoice_paid(payment: Payment) -> None: async def on_invoice_paid(payment: Payment) -> None:
# (avoid loops) # (avoid loops)
if "switch" == payment.extra.get("tag"): if "Switch" == payment.extra.get("tag"):
lnurldevicepayment = await get_lnurldevicepayment(payment.extra.get("id")) lnurldevicepayment = await get_lnurldevicepayment(payment.extra.get("id"))
if not lnurldevicepayment: if not lnurldevicepayment:
return return
if lnurldevicepayment.payhash == "used": if lnurldevicepayment.payhash == "used":
return return
lnurldevicepayment = await update_lnurldevicepayment( lnurldevicepayment = await update_lnurldevicepayment(
lnurldevicepayment_id=paymentid, payhash="used" lnurldevicepayment_id=payment.extra.get("id"), payhash="used"
) )
return await updater(lnurldevicepayment.deviceid) return await updater(lnurldevicepayment.deviceid)
return return

View file

@ -240,6 +240,7 @@
fill-mask="0" fill-mask="0"
reverse-fill-mask reverse-fill-mask
:step="'0.01'" :step="'0.01'"
value="0.00"
></q-input> ></q-input>
<q-input <q-input
filled filled
@ -420,7 +421,7 @@
show_ack: false, show_ack: false,
show_price: 'None', show_price: 'None',
device: 'pos', device: 'pos',
profit: 2, profit: 0,
amount: 1, amount: 1,
title: '' title: ''
} }

View file

@ -32,16 +32,17 @@ async def api_list_currencies_available():
@lnurldevice_ext.post("/api/v1/lnurlpos") @lnurldevice_ext.post("/api/v1/lnurlpos")
@lnurldevice_ext.put("/api/v1/lnurlpos/{lnurldevice_id}") @lnurldevice_ext.put("/api/v1/lnurlpos/{lnurldevice_id}")
async def api_lnurldevice_create_or_update( async def api_lnurldevice_create_or_update(
req: Request,
data: createLnurldevice, data: createLnurldevice,
wallet: WalletTypeInfo = Depends(require_admin_key), wallet: WalletTypeInfo = Depends(require_admin_key),
lnurldevice_id: str = Query(None), lnurldevice_id: str = Query(None),
): ):
if not lnurldevice_id: if not lnurldevice_id:
lnurldevice = await create_lnurldevice(data) lnurldevice = await create_lnurldevice(data)
return lnurldevice.dict() return {**lnurldevice.dict(), **{"lnurl": lnurldevice.lnurl(req)}}
else: else:
lnurldevice = await update_lnurldevice(data, lnurldevice_id=lnurldevice_id) lnurldevice = await update_lnurldevice(data, lnurldevice_id=lnurldevice_id)
return lnurldevice.dict() return {**lnurldevice.dict(), **{"lnurl": lnurldevice.lnurl(req)}}
@lnurldevice_ext.get("/api/v1/lnurlpos") @lnurldevice_ext.get("/api/v1/lnurlpos")
@ -64,7 +65,7 @@ async def api_lnurldevices_retrieve(req: Request, wallet: WalletTypeInfo = Depen
@lnurldevice_ext.get("/api/v1/lnurlpos/{lnurldevice_id}") @lnurldevice_ext.get("/api/v1/lnurlpos/{lnurldevice_id}")
async def api_lnurldevice_retrieve( async def api_lnurldevice_retrieve(
request: Request, req: Request,
wallet: WalletTypeInfo = Depends(get_key_type), wallet: WalletTypeInfo = Depends(get_key_type),
lnurldevice_id: str = Query(None), lnurldevice_id: str = Query(None),
): ):
@ -75,7 +76,7 @@ async def api_lnurldevice_retrieve(
) )
if not lnurldevice.lnurl_toggle: if not lnurldevice.lnurl_toggle:
return {**lnurldevice.dict()} return {**lnurldevice.dict()}
return {**lnurldevice.dict(), **{"lnurl": lnurldevice.lnurl(request=request)}} return {**lnurldevice.dict(), **{"lnurl": lnurldevice.lnurl(req)}}
@lnurldevice_ext.delete("/api/v1/lnurlpos/{lnurldevice_id}") @lnurldevice_ext.delete("/api/v1/lnurlpos/{lnurldevice_id}")