- Register LNURLDevice devices to receive payments in your LNbits wallet.
- Build your own here
- https://github.com/arcbtc/bitcoinpos
+ Such as the LNPoS
+ https://lnbits.github.io/lnpos
Created by, Ben Arc
+
LNURLDevice Settings
+
+
+ bitcoinSwitch embeddable QRCode
+
+
LNURLDevice device string
+
{% raw
+ %}{{wslocation}}/lnurldevice/ws/{{settingsDialog.data.id}}{% endraw
+ %} Click to copy URL
+
+ Click to copy URL
-
+
@@ -191,6 +221,7 @@
label="Type of device"
>
+
+
+
+
{
diff --git a/lnbits/extensions/lnurldevice/views.py b/lnbits/extensions/lnurldevice/views.py
index 4a28a5c1a..a64de84b8 100644
--- a/lnbits/extensions/lnurldevice/views.py
+++ b/lnbits/extensions/lnurldevice/views.py
@@ -1,4 +1,6 @@
from http import HTTPStatus
+import pyqrcode
+from io import BytesIO
from fastapi import Request
from fastapi.param_functions import Query
@@ -14,6 +16,9 @@ from lnbits.decorators import check_user_exists
from . import lnurldevice_ext, lnurldevice_renderer
from .crud import get_lnurldevice, get_lnurldevicepayment
+from fastapi import Request, WebSocket, WebSocketDisconnect
+
+from starlette.responses import HTMLResponse, StreamingResponse
templates = Jinja2Templates(directory="templates")
@@ -52,6 +57,30 @@ async def displaypin(request: Request, paymentid: str = Query(None)):
{"request": request, "pin": "filler", "not_paid": True},
)
+@lnurldevice_ext.get("/img/{lnurldevice_id}", response_class=StreamingResponse)
+async def img(request: Request, lnurldevice_id):
+ lnurldevice = await get_lnurldevice(lnurldevice_id)
+ if not lnurldevice:
+ raise HTTPException(
+ status_code=HTTPStatus.NOT_FOUND, detail="LNURLDevice does not exist."
+ )
+ qr = pyqrcode.create(lnurldevice.lnurl(request))
+ stream = BytesIO()
+ qr.svg(stream, scale=3)
+ stream.seek(0)
+
+ async def _generator(stream: BytesIO):
+ yield stream.getvalue()
+
+ return StreamingResponse(
+ _generator(stream),
+ headers={
+ "Content-Type": "image/svg+xml",
+ "Cache-Control": "no-cache, no-store, must-revalidate",
+ "Pragma": "no-cache",
+ "Expires": "0",
+ },
+ )
##################WEBSOCKET ROUTES########################
@@ -95,4 +124,5 @@ async def updater(lnurldevice_id):
lnurldevice = await get_lnurldevice(lnurldevice_id)
if not lnurldevice:
return
- await manager.send_personal_message(f"{lnurldevice.amount}", lnurldevice_id)
\ No newline at end of file
+ await manager.send_personal_message(f"{lnurldevice.amount}", lnurldevice_id)
+
From 3bf38884ed8cb30ef9b5c428fdaea1acbedf1020 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?dni=20=E2=9A=A1?=
Date: Fri, 7 Oct 2022 08:30:07 +0200
Subject: [PATCH 19/29] log successful connection to backend with
logger.success()
---
lnbits/app.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lnbits/app.py b/lnbits/app.py
index 514825380..8b9cf7985 100644
--- a/lnbits/app.py
+++ b/lnbits/app.py
@@ -126,7 +126,7 @@ def check_funding_source(app: FastAPI) -> None:
logger.info("Retrying connection to backend in 5 seconds...")
await asyncio.sleep(5)
signal.signal(signal.SIGINT, original_sigint_handler)
- logger.info(
+ logger.success(
f"✔️ Backend {WALLET.__class__.__name__} connected and with a balance of {balance} msat."
)
From 52dc528a8a7557da685da624e22058e737e49a16 Mon Sep 17 00:00:00 2001
From: ben
Date: Fri, 7 Oct 2022 11:29:06 +0100
Subject: [PATCH 20/29] Added qrdialogue
---
.../templates/lnurldevice/index.html | 61 +++++++++++++++----
lnbits/extensions/lnurldevice/views.py | 19 +-----
lnbits/extensions/lnurldevice/views_api.py | 13 +++-
3 files changed, 61 insertions(+), 32 deletions(-)
diff --git a/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html b/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html
index 528e5afe6..b55c83f76 100644
--- a/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html
+++ b/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html
@@ -94,18 +94,17 @@
- bitcoinSwitch embeddable QRCode
-
+ v-if="props.row.device == 'switch'"
+ :disable="protocol == 'http:'"
+ flat
+ unelevated
+ dense
+ size="xs"
+ icon="visibility"
+ :color="($q.dark.isActive) ? 'grey-7' : 'grey-5'"
+ @click="openQrCodeDialog(props.row.id)"
+ > LNURLs only work over HTTPS view LNURL
+
+
+
+
+
+ {% raw %}
+
+
+ ID: {{ qrCodeDialog.data.id }}
+
+
+ {% endraw %}
+
+ Copy LNURL
+ Close
+
+
+
{% endblock %} {% block scripts %} {{ window_vars(user) }}
@@ -306,6 +333,7 @@
mixins: [windowMixin],
data: function () {
return {
+ protocol: window.location.protocol,
location: window.location.hostname,
wslocation: window.location.hostname,
filter: '',
@@ -404,6 +432,14 @@
}
},
methods: {
+ openQrCodeDialog: function (lnurldevice_id) {
+ var lnurldevice = _.findWhere(this.lnurldeviceLinks, {id: lnurldevice_id})
+ console.log(lnurldevice)
+ this.qrCodeDialog.data = _.clone(lnurldevice)
+ this.qrCodeDialog.data.url =
+ window.location.protocol + '//' + window.location.host
+ this.qrCodeDialog.show = true
+ },
cancellnurldevice: function (data) {
var self = this
self.formDialoglnurldevice.show = false
@@ -460,6 +496,7 @@
.then(function (response) {
if (response.data) {
self.lnurldeviceLinks = response.data.map(maplnurldevice)
+ console.log(response.data)
}
})
.catch(function (error) {
diff --git a/lnbits/extensions/lnurldevice/views.py b/lnbits/extensions/lnurldevice/views.py
index a64de84b8..26f581d36 100644
--- a/lnbits/extensions/lnurldevice/views.py
+++ b/lnbits/extensions/lnurldevice/views.py
@@ -64,23 +64,8 @@ async def img(request: Request, lnurldevice_id):
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, detail="LNURLDevice does not exist."
)
- qr = pyqrcode.create(lnurldevice.lnurl(request))
- stream = BytesIO()
- qr.svg(stream, scale=3)
- stream.seek(0)
-
- async def _generator(stream: BytesIO):
- yield stream.getvalue()
-
- return StreamingResponse(
- _generator(stream),
- headers={
- "Content-Type": "image/svg+xml",
- "Cache-Control": "no-cache, no-store, must-revalidate",
- "Pragma": "no-cache",
- "Expires": "0",
- },
- )
+ return lnurldevice.lnurl(request)
+
##################WEBSOCKET ROUTES########################
diff --git a/lnbits/extensions/lnurldevice/views_api.py b/lnbits/extensions/lnurldevice/views_api.py
index d152d210c..4a4c2b905 100644
--- a/lnbits/extensions/lnurldevice/views_api.py
+++ b/lnbits/extensions/lnurldevice/views_api.py
@@ -45,14 +45,21 @@ async def api_lnurldevice_create_or_update(
@lnurldevice_ext.get("/api/v1/lnurlpos")
-async def api_lnurldevices_retrieve(wallet: WalletTypeInfo = Depends(get_key_type)):
+async def api_lnurldevices_retrieve(req: Request, wallet: WalletTypeInfo = Depends(get_key_type)):
wallet_ids = (await get_user(wallet.wallet.user)).wallet_ids
try:
return [
- {**lnurldevice.dict()} for lnurldevice in await get_lnurldevices(wallet_ids)
+ {**lnurldevice.dict(), **{"lnurl": lnurldevice.lnurl(req)}}
+ for lnurldevice in await get_lnurldevices(wallet_ids)
]
except:
- return ""
+ try:
+ return [
+ {**lnurldevice.dict()}
+ for lnurldevice in await get_lnurldevices(wallet_ids)
+ ]
+ except:
+ return ""
@lnurldevice_ext.get("/api/v1/lnurlpos/{lnurldevice_id}")
From 7711387d6472171539493c2f830869edef1e49fd Mon Sep 17 00:00:00 2001
From: Vlad Stan
Date: Fri, 7 Oct 2022 15:23:57 +0300
Subject: [PATCH 21/29] fix: use bigint for amounts in postgres (#1030)
---
lnbits/db.py | 6 ++++++
lnbits/extensions/boltcards/migrations.py | 8 ++++----
lnbits/extensions/boltz/migrations.py | 12 ++++++------
lnbits/extensions/invoices/migrations.py | 2 +-
lnbits/extensions/lnurldevice/migrations.py | 2 +-
lnbits/extensions/lnurlpayout/migrations.py | 4 ++--
lnbits/extensions/streamalerts/migrations.py | 2 +-
lnbits/extensions/tipjar/migrations.py | 4 ++--
8 files changed, 23 insertions(+), 17 deletions(-)
diff --git a/lnbits/db.py b/lnbits/db.py
index 669817842..f52b03914 100644
--- a/lnbits/db.py
+++ b/lnbits/db.py
@@ -52,6 +52,12 @@ class Compat:
return ""
return ""
+ @property
+ def big_int(self) -> str:
+ if self.type in {POSTGRES}:
+ return "BIGINT"
+ return "INT"
+
class Connection(Compat):
def __init__(self, conn: AsyncConnection, txn, typ, name, schema):
diff --git a/lnbits/extensions/boltcards/migrations.py b/lnbits/extensions/boltcards/migrations.py
index 081260139..9609e0c37 100644
--- a/lnbits/extensions/boltcards/migrations.py
+++ b/lnbits/extensions/boltcards/migrations.py
@@ -29,7 +29,7 @@ async def m001_initial(db):
)
await db.execute(
- """
+ f"""
CREATE TABLE boltcards.hits (
id TEXT PRIMARY KEY UNIQUE,
card_id TEXT NOT NULL,
@@ -38,7 +38,7 @@ async def m001_initial(db):
useragent TEXT,
old_ctr INT NOT NULL DEFAULT 0,
new_ctr INT NOT NULL DEFAULT 0,
- amount INT NOT NULL,
+ amount {db.big_int} NOT NULL,
time TIMESTAMP NOT NULL DEFAULT """
+ db.timestamp_now
+ """
@@ -47,11 +47,11 @@ async def m001_initial(db):
)
await db.execute(
- """
+ f"""
CREATE TABLE boltcards.refunds (
id TEXT PRIMARY KEY UNIQUE,
hit_id TEXT NOT NULL,
- refund_amount INT NOT NULL,
+ refund_amount {db.big_int} NOT NULL,
time TIMESTAMP NOT NULL DEFAULT """
+ db.timestamp_now
+ """
diff --git a/lnbits/extensions/boltz/migrations.py b/lnbits/extensions/boltz/migrations.py
index e4026dd04..925322ecd 100644
--- a/lnbits/extensions/boltz/migrations.py
+++ b/lnbits/extensions/boltz/migrations.py
@@ -1,16 +1,16 @@
async def m001_initial(db):
await db.execute(
- """
+ f"""
CREATE TABLE boltz.submarineswap (
id TEXT PRIMARY KEY,
wallet TEXT NOT NULL,
payment_hash TEXT NOT NULL,
- amount INT NOT NULL,
+ amount {db.big_int} NOT NULL,
status TEXT NOT NULL,
boltz_id TEXT NOT NULL,
refund_address TEXT NOT NULL,
refund_privkey TEXT NOT NULL,
- expected_amount INT NOT NULL,
+ expected_amount {db.big_int} NOT NULL,
timeout_block_height INT NOT NULL,
address TEXT NOT NULL,
bip21 TEXT NOT NULL,
@@ -22,12 +22,12 @@ async def m001_initial(db):
"""
)
await db.execute(
- """
+ f"""
CREATE TABLE boltz.reverse_submarineswap (
id TEXT PRIMARY KEY,
wallet TEXT NOT NULL,
onchain_address TEXT NOT NULL,
- amount INT NOT NULL,
+ amount {db.big_int} NOT NULL,
instant_settlement BOOLEAN NOT NULL,
status TEXT NOT NULL,
boltz_id TEXT NOT NULL,
@@ -37,7 +37,7 @@ async def m001_initial(db):
claim_privkey TEXT NOT NULL,
lockup_address TEXT NOT NULL,
invoice TEXT NOT NULL,
- onchain_amount INT NOT NULL,
+ onchain_amount {db.big_int} NOT NULL,
time TIMESTAMP NOT NULL DEFAULT """
+ db.timestamp_now
+ """
diff --git a/lnbits/extensions/invoices/migrations.py b/lnbits/extensions/invoices/migrations.py
index c47a954ae..74a0fdbad 100644
--- a/lnbits/extensions/invoices/migrations.py
+++ b/lnbits/extensions/invoices/migrations.py
@@ -45,7 +45,7 @@ async def m001_initial_invoices(db):
id TEXT PRIMARY KEY,
invoice_id TEXT NOT NULL,
- amount INT NOT NULL,
+ amount {db.big_int} NOT NULL,
time TIMESTAMP NOT NULL DEFAULT {db.timestamp_now},
diff --git a/lnbits/extensions/lnurldevice/migrations.py b/lnbits/extensions/lnurldevice/migrations.py
index c7899282c..da62cb7e6 100644
--- a/lnbits/extensions/lnurldevice/migrations.py
+++ b/lnbits/extensions/lnurldevice/migrations.py
@@ -29,7 +29,7 @@ async def m001_initial(db):
payhash TEXT,
payload TEXT NOT NULL,
pin INT,
- sats INT,
+ sats {db.big_int},
timestamp TIMESTAMP NOT NULL DEFAULT {db.timestamp_now}
);
"""
diff --git a/lnbits/extensions/lnurlpayout/migrations.py b/lnbits/extensions/lnurlpayout/migrations.py
index 6af047910..7a45e4953 100644
--- a/lnbits/extensions/lnurlpayout/migrations.py
+++ b/lnbits/extensions/lnurlpayout/migrations.py
@@ -3,14 +3,14 @@ async def m001_initial(db):
Initial lnurlpayouts table.
"""
await db.execute(
- """
+ f"""
CREATE TABLE lnurlpayout.lnurlpayouts (
id TEXT PRIMARY KEY,
title TEXT NOT NULL,
wallet TEXT NOT NULL,
admin_key TEXT NOT NULL,
lnurlpay TEXT NOT NULL,
- threshold INT NOT NULL
+ threshold {db.big_int} NOT NULL
);
"""
)
diff --git a/lnbits/extensions/streamalerts/migrations.py b/lnbits/extensions/streamalerts/migrations.py
index 1b0cea375..7d50e8f11 100644
--- a/lnbits/extensions/streamalerts/migrations.py
+++ b/lnbits/extensions/streamalerts/migrations.py
@@ -25,7 +25,7 @@ async def m001_initial(db):
name TEXT NOT NULL,
message TEXT NOT NULL,
cur_code TEXT NOT NULL,
- sats INT NOT NULL,
+ sats {db.big_int} NOT NULL,
amount FLOAT NOT NULL,
service INTEGER NOT NULL,
posted BOOLEAN NOT NULL,
diff --git a/lnbits/extensions/tipjar/migrations.py b/lnbits/extensions/tipjar/migrations.py
index 6b58fbca2..d8f6da3f0 100644
--- a/lnbits/extensions/tipjar/migrations.py
+++ b/lnbits/extensions/tipjar/migrations.py
@@ -19,8 +19,8 @@ async def m001_initial(db):
wallet TEXT NOT NULL,
name TEXT NOT NULL,
message TEXT NOT NULL,
- sats INT NOT NULL,
- tipjar INT NOT NULL,
+ sats {db.big_int} NOT NULL,
+ tipjar {db.big_int} NOT NULL,
FOREIGN KEY(tipjar) REFERENCES {db.references_schema}TipJars(id)
);
"""
From 8d4337679f93161966310ccf56d30eb4fd576317 Mon Sep 17 00:00:00 2001
From: ben
Date: Fri, 7 Oct 2022 13:46:40 +0100
Subject: [PATCH 22/29] Websocket/listener working
---
lnbits/extensions/lnurldevice/crud.py | 6 +++--
lnbits/extensions/lnurldevice/lnurl.py | 26 +++++++++++--------
lnbits/extensions/lnurldevice/tasks.py | 8 +++---
.../templates/lnurldevice/index.html | 3 ++-
lnbits/extensions/lnurldevice/views_api.py | 9 ++++---
5 files changed, 30 insertions(+), 22 deletions(-)
diff --git a/lnbits/extensions/lnurldevice/crud.py b/lnbits/extensions/lnurldevice/crud.py
index 451665212..4c25e4cb4 100644
--- a/lnbits/extensions/lnurldevice/crud.py
+++ b/lnbits/extensions/lnurldevice/crud.py
@@ -22,9 +22,10 @@ async def create_lnurldevice(
wallet,
currency,
device,
- profit
+ profit,
+ amount
)
- VALUES (?, ?, ?, ?, ?, ?, ?)
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
""",
(
lnurldevice_id,
@@ -34,6 +35,7 @@ async def create_lnurldevice(
data.currency,
data.device,
data.profit,
+ data.amount,
),
)
return await get_lnurldevice(lnurldevice_id)
diff --git a/lnbits/extensions/lnurldevice/lnurl.py b/lnbits/extensions/lnurldevice/lnurl.py
index a2bc0dd4f..3823005ea 100644
--- a/lnbits/extensions/lnurldevice/lnurl.py
+++ b/lnbits/extensions/lnurldevice/lnurl.py
@@ -103,9 +103,19 @@ async def lnurl_v1_params(
if paymentcheck:
return {"status": "ERROR", "reason": f"Payment already claimed"}
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(
deviceid=device.id,
- sats=device.profit,
+ payload="bla",
+ sats=price_msat,
+ pin=1,
+ payhash="bla",
)
if not lnurldevicepayment:
return {"status": "ERROR", "reason": "Could not create payment."}
@@ -114,8 +124,8 @@ async def lnurl_v1_params(
"callback": request.url_for(
"lnurldevice.lnurl_callback", paymentid=lnurldevicepayment.id
),
- "minSendable": device.profit * 1000,
- "maxSendable": device.profit * 1000,
+ "minSendable": price_msat,
+ "maxSendable": price_msat,
"metadata": await device.lnurlpay_metadata(),
}
if len(p) % 4 > 0:
@@ -224,21 +234,15 @@ async def lnurl_callback(
payment_hash, payment_request = await create_invoice(
wallet_id=device.wallet,
amount=lnurldevicepayment.sats / 1000,
- memo=device.title,
+ memo=device.title + "-" + lnurldevicepayment.id,
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_id=paymentid, payhash=payment_hash
)
-
return {
"pr": payment_request,
- "successAction": {
- "tag": "url",
- "description": "Check the attached link",
- "url": request.url_for("lnurldevice.displaypin", paymentid=paymentid),
- },
"routes": [],
}
diff --git a/lnbits/extensions/lnurldevice/tasks.py b/lnbits/extensions/lnurldevice/tasks.py
index 2337c0ad1..4bf0d3b90 100644
--- a/lnbits/extensions/lnurldevice/tasks.py
+++ b/lnbits/extensions/lnurldevice/tasks.py
@@ -12,8 +12,9 @@ from lnbits.core.services import pay_invoice
from lnbits.helpers import get_current_extension_name
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 loguru import logger
async def wait_for_paid_invoices():
invoice_queue = asyncio.Queue()
@@ -23,17 +24,16 @@ async def wait_for_paid_invoices():
payment = await invoice_queue.get()
await on_invoice_paid(payment)
-
async def on_invoice_paid(payment: Payment) -> None:
# (avoid loops)
- if "switch" == payment.extra.get("tag"):
+ if "Switch" == payment.extra.get("tag"):
lnurldevicepayment = await get_lnurldevicepayment(payment.extra.get("id"))
if not lnurldevicepayment:
return
if lnurldevicepayment.payhash == "used":
return
lnurldevicepayment = await update_lnurldevicepayment(
- lnurldevicepayment_id=paymentid, payhash="used"
+ lnurldevicepayment_id=payment.extra.get("id"), payhash="used"
)
return await updater(lnurldevicepayment.deviceid)
return
\ No newline at end of file
diff --git a/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html b/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html
index b55c83f76..ccb0a6e94 100644
--- a/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html
+++ b/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html
@@ -240,6 +240,7 @@
fill-mask="0"
reverse-fill-mask
:step="'0.01'"
+ value="0.00"
>
Date: Fri, 7 Oct 2022 23:18:57 +0100
Subject: [PATCH 23/29] Black
---
lnbits/extensions/lnurldevice/__init__.py | 2 ++
lnbits/extensions/lnurldevice/lnurl.py | 2 +-
lnbits/extensions/lnurldevice/migrations.py | 5 ++++-
lnbits/extensions/lnurldevice/models.py | 4 +---
lnbits/extensions/lnurldevice/tasks.py | 10 ++++++----
lnbits/extensions/lnurldevice/views.py | 4 ++--
lnbits/extensions/lnurldevice/views_api.py | 12 +++++++-----
7 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/lnbits/extensions/lnurldevice/__init__.py b/lnbits/extensions/lnurldevice/__init__.py
index 5452e3562..d987e6cc1 100644
--- a/lnbits/extensions/lnurldevice/__init__.py
+++ b/lnbits/extensions/lnurldevice/__init__.py
@@ -13,11 +13,13 @@ lnurldevice_ext: APIRouter = APIRouter(prefix="/lnurldevice", tags=["lnurldevice
def lnurldevice_renderer():
return template_renderer(["lnbits/extensions/lnurldevice/templates"])
+
from .tasks import wait_for_paid_invoices
from .lnurl import * # noqa
from .views import * # noqa
from .views_api import * # noqa
+
def lnurldevice_start():
loop = asyncio.get_event_loop()
loop.create_task(catch_everything_and_restart(wait_for_paid_invoices))
diff --git a/lnbits/extensions/lnurldevice/lnurl.py b/lnbits/extensions/lnurldevice/lnurl.py
index 3823005ea..79892b78a 100644
--- a/lnbits/extensions/lnurldevice/lnurl.py
+++ b/lnbits/extensions/lnurldevice/lnurl.py
@@ -122,7 +122,7 @@ async def lnurl_v1_params(
return {
"tag": "payRequest",
"callback": request.url_for(
- "lnurldevice.lnurl_callback", paymentid=lnurldevicepayment.id
+ "lnurldevice.lnurl_callback", paymentid=lnurldevicepayment.id
),
"minSendable": price_msat,
"maxSendable": price_msat,
diff --git a/lnbits/extensions/lnurldevice/migrations.py b/lnbits/extensions/lnurldevice/migrations.py
index 65913b023..fa56b3d13 100644
--- a/lnbits/extensions/lnurldevice/migrations.py
+++ b/lnbits/extensions/lnurldevice/migrations.py
@@ -80,8 +80,11 @@ async def m002_redux(db):
except:
return
+
async def m003_redux(db):
"""
Add 'meta' for storing various metadata about the wallet
"""
- await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount INT DEFAULT 0;")
\ No newline at end of file
+ await db.execute(
+ "ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount INT DEFAULT 0;"
+ )
diff --git a/lnbits/extensions/lnurldevice/models.py b/lnbits/extensions/lnurldevice/models.py
index 0714c656d..01bcc2ba6 100644
--- a/lnbits/extensions/lnurldevice/models.py
+++ b/lnbits/extensions/lnurldevice/models.py
@@ -35,9 +35,7 @@ class lnurldevices(BaseModel):
return cls(**dict(row))
def lnurl(self, req: Request) -> Lnurl:
- url = req.url_for(
- "lnurldevice.lnurl_v1_params", device_id=self.id
- )
+ url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id)
return lnurl_encode(url)
async def lnurlpay_metadata(self) -> LnurlPayMetadata:
diff --git a/lnbits/extensions/lnurldevice/tasks.py b/lnbits/extensions/lnurldevice/tasks.py
index 4bf0d3b90..2f048138a 100644
--- a/lnbits/extensions/lnurldevice/tasks.py
+++ b/lnbits/extensions/lnurldevice/tasks.py
@@ -16,6 +16,7 @@ from .crud import get_lnurldevice, get_lnurldevicepayment, update_lnurldevicepay
from .views import updater
from loguru import logger
+
async def wait_for_paid_invoices():
invoice_queue = asyncio.Queue()
register_invoice_listener(invoice_queue, get_current_extension_name())
@@ -23,7 +24,8 @@ async def wait_for_paid_invoices():
while True:
payment = await invoice_queue.get()
await on_invoice_paid(payment)
-
+
+
async def on_invoice_paid(payment: Payment) -> None:
# (avoid loops)
if "Switch" == payment.extra.get("tag"):
@@ -33,7 +35,7 @@ async def on_invoice_paid(payment: Payment) -> None:
if lnurldevicepayment.payhash == "used":
return
lnurldevicepayment = await update_lnurldevicepayment(
- lnurldevicepayment_id=payment.extra.get("id"), payhash="used"
- )
+ lnurldevicepayment_id=payment.extra.get("id"), payhash="used"
+ )
return await updater(lnurldevicepayment.deviceid)
- return
\ No newline at end of file
+ return
diff --git a/lnbits/extensions/lnurldevice/views.py b/lnbits/extensions/lnurldevice/views.py
index 26f581d36..752d2c81b 100644
--- a/lnbits/extensions/lnurldevice/views.py
+++ b/lnbits/extensions/lnurldevice/views.py
@@ -57,6 +57,7 @@ async def displaypin(request: Request, paymentid: str = Query(None)):
{"request": request, "pin": "filler", "not_paid": True},
)
+
@lnurldevice_ext.get("/img/{lnurldevice_id}", response_class=StreamingResponse)
async def img(request: Request, lnurldevice_id):
lnurldevice = await get_lnurldevice(lnurldevice_id)
@@ -65,7 +66,7 @@ async def img(request: Request, lnurldevice_id):
status_code=HTTPStatus.NOT_FOUND, detail="LNURLDevice does not exist."
)
return lnurldevice.lnurl(request)
-
+
##################WEBSOCKET ROUTES########################
@@ -110,4 +111,3 @@ async def updater(lnurldevice_id):
if not lnurldevice:
return
await manager.send_personal_message(f"{lnurldevice.amount}", lnurldevice_id)
-
diff --git a/lnbits/extensions/lnurldevice/views_api.py b/lnbits/extensions/lnurldevice/views_api.py
index 65625cbb9..c034f66ed 100644
--- a/lnbits/extensions/lnurldevice/views_api.py
+++ b/lnbits/extensions/lnurldevice/views_api.py
@@ -46,18 +46,20 @@ async def api_lnurldevice_create_or_update(
@lnurldevice_ext.get("/api/v1/lnurlpos")
-async def api_lnurldevices_retrieve(req: Request, wallet: WalletTypeInfo = Depends(get_key_type)):
+async def api_lnurldevices_retrieve(
+ req: Request, wallet: WalletTypeInfo = Depends(get_key_type)
+):
wallet_ids = (await get_user(wallet.wallet.user)).wallet_ids
try:
return [
- {**lnurldevice.dict(), **{"lnurl": lnurldevice.lnurl(req)}}
- for lnurldevice in await get_lnurldevices(wallet_ids)
+ {**lnurldevice.dict(), **{"lnurl": lnurldevice.lnurl(req)}}
+ for lnurldevice in await get_lnurldevices(wallet_ids)
]
except:
try:
return [
- {**lnurldevice.dict()}
- for lnurldevice in await get_lnurldevices(wallet_ids)
+ {**lnurldevice.dict()}
+ for lnurldevice in await get_lnurldevices(wallet_ids)
]
except:
return ""
From d4a5fe27768a8d05417e7ed8d6340b2420291a5f Mon Sep 17 00:00:00 2001
From: ben
Date: Fri, 7 Oct 2022 23:48:42 +0100
Subject: [PATCH 24/29] isort
---
lnbits/extensions/lnurldevice/tasks.py | 4 ++--
lnbits/extensions/lnurldevice/views.py | 9 +++------
2 files changed, 5 insertions(+), 8 deletions(-)
diff --git a/lnbits/extensions/lnurldevice/tasks.py b/lnbits/extensions/lnurldevice/tasks.py
index 2f048138a..db8d87f03 100644
--- a/lnbits/extensions/lnurldevice/tasks.py
+++ b/lnbits/extensions/lnurldevice/tasks.py
@@ -12,9 +12,9 @@ from lnbits.core.services import pay_invoice
from lnbits.helpers import get_current_extension_name
from lnbits.tasks import register_invoice_listener
-from .crud import get_lnurldevice, get_lnurldevicepayment, update_lnurldevicepayment
+from .crud import (get_lnurldevice, get_lnurldevicepayment,
+ update_lnurldevicepayment)
from .views import updater
-from loguru import logger
async def wait_for_paid_invoices():
diff --git a/lnbits/extensions/lnurldevice/views.py b/lnbits/extensions/lnurldevice/views.py
index 752d2c81b..5c6eba24b 100644
--- a/lnbits/extensions/lnurldevice/views.py
+++ b/lnbits/extensions/lnurldevice/views.py
@@ -1,13 +1,13 @@
from http import HTTPStatus
-import pyqrcode
from io import BytesIO
-from fastapi import Request
+import pyqrcode
+from fastapi import Request, WebSocket, WebSocketDisconnect
from fastapi.param_functions import Query
from fastapi.params import Depends
from fastapi.templating import Jinja2Templates
from starlette.exceptions import HTTPException
-from starlette.responses import HTMLResponse
+from starlette.responses import HTMLResponse, StreamingResponse
from lnbits.core.crud import update_payment_status
from lnbits.core.models import User
@@ -16,9 +16,6 @@ from lnbits.decorators import check_user_exists
from . import lnurldevice_ext, lnurldevice_renderer
from .crud import get_lnurldevice, get_lnurldevicepayment
-from fastapi import Request, WebSocket, WebSocketDisconnect
-
-from starlette.responses import HTMLResponse, StreamingResponse
templates = Jinja2Templates(directory="templates")
From e3bd38fc6b11cbc9c1382fbac5fdfc005a0142db Mon Sep 17 00:00:00 2001
From: ben
Date: Fri, 7 Oct 2022 23:51:28 +0100
Subject: [PATCH 25/29] back
---
lnbits/extensions/lnurldevice/tasks.py | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/lnbits/extensions/lnurldevice/tasks.py b/lnbits/extensions/lnurldevice/tasks.py
index db8d87f03..c8f3db04f 100644
--- a/lnbits/extensions/lnurldevice/tasks.py
+++ b/lnbits/extensions/lnurldevice/tasks.py
@@ -12,8 +12,7 @@ from lnbits.core.services import pay_invoice
from lnbits.helpers import get_current_extension_name
from lnbits.tasks import register_invoice_listener
-from .crud import (get_lnurldevice, get_lnurldevicepayment,
- update_lnurldevicepayment)
+from .crud import get_lnurldevice, get_lnurldevicepayment, update_lnurldevicepayment
from .views import updater
From 34effe3ae5690ad3b68d0a1af34ccc2d9d9b6e21 Mon Sep 17 00:00:00 2001
From: ben
Date: Fri, 7 Oct 2022 23:57:28 +0100
Subject: [PATCH 26/29] isort
---
lnbits/extensions/lnurldevice/__init__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lnbits/extensions/lnurldevice/__init__.py b/lnbits/extensions/lnurldevice/__init__.py
index d987e6cc1..c27c9e17d 100644
--- a/lnbits/extensions/lnurldevice/__init__.py
+++ b/lnbits/extensions/lnurldevice/__init__.py
@@ -2,8 +2,8 @@ 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
+from lnbits.helpers import template_renderer
db = Database("ext_lnurldevice")
From fbc20b3579169b44227cc8ba8e20cc78be1b65f5 Mon Sep 17 00:00:00 2001
From: ben
Date: Sat, 8 Oct 2022 01:28:46 +0100
Subject: [PATCH 27/29] added credits
---
.../templates/lnurldevice/_api_docs.html | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/lnbits/extensions/lnurldevice/templates/lnurldevice/_api_docs.html b/lnbits/extensions/lnurldevice/templates/lnurldevice/_api_docs.html
index 7497714e1..b239e9812 100644
--- a/lnbits/extensions/lnurldevice/templates/lnurldevice/_api_docs.html
+++ b/lnbits/extensions/lnurldevice/templates/lnurldevice/_api_docs.html
@@ -2,12 +2,21 @@
For LNURL based Points of Sale, ATMs, and relay devices
- Such as the LNPoS
+ Use with:
+ LNPoS
https://lnbits.github.io/lnpos
+ bitcoinSwitch
+ https://github.com/lnbits/bitcoinSwitch
+ FOSSA
+ https://github.com/lnbits/fossa
- Created by, Ben ArcBen Arc