From c8a33b0b93bb3e04bfb3d4ef1903cd1396fb3068 Mon Sep 17 00:00:00 2001 From: ben Date: Fri, 21 Oct 2022 20:06:50 +0100 Subject: [PATCH 01/21] Adding loads on gpios to switch --- lnbits/extensions/lnurldevice/lnurl.py | 5 +++-- lnbits/extensions/lnurldevice/tasks.py | 2 +- lnbits/extensions/lnurldevice/views.py | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lnbits/extensions/lnurldevice/lnurl.py b/lnbits/extensions/lnurldevice/lnurl.py index 79892b78..c83db6b8 100644 --- a/lnbits/extensions/lnurldevice/lnurl.py +++ b/lnbits/extensions/lnurldevice/lnurl.py @@ -91,6 +91,7 @@ async def lnurl_v1_params( device_id: str = Query(None), p: str = Query(None), atm: str = Query(None), + gpio: str = Query(None), ): device = await get_lnurldevice(device_id) if not device: @@ -114,7 +115,7 @@ async def lnurl_v1_params( deviceid=device.id, payload="bla", sats=price_msat, - pin=1, + pin=gpio, payhash="bla", ) if not lnurldevicepayment: @@ -236,7 +237,7 @@ async def lnurl_callback( amount=lnurldevicepayment.sats / 1000, memo=device.title + "-" + lnurldevicepayment.id, unhashed_description=(await device.lnurlpay_metadata()).encode("utf-8"), - extra={"tag": "Switch", "id": paymentid, "time": device.amount}, + extra={"tag": "Switch", "pin": ,"id": paymentid, "time": device.amount}, ) lnurldevicepayment = await update_lnurldevicepayment( lnurldevicepayment_id=paymentid, payhash=payment_hash diff --git a/lnbits/extensions/lnurldevice/tasks.py b/lnbits/extensions/lnurldevice/tasks.py index c8f3db04..55cbaa98 100644 --- a/lnbits/extensions/lnurldevice/tasks.py +++ b/lnbits/extensions/lnurldevice/tasks.py @@ -36,5 +36,5 @@ async def on_invoice_paid(payment: Payment) -> None: lnurldevicepayment = await update_lnurldevicepayment( lnurldevicepayment_id=payment.extra.get("id"), payhash="used" ) - return await updater(lnurldevicepayment.deviceid) + return await updater(lnurldevicepayment.deviceid, lnurldevicepayment.pin) return diff --git a/lnbits/extensions/lnurldevice/views.py b/lnbits/extensions/lnurldevice/views.py index 5c6eba24..d17db7d7 100644 --- a/lnbits/extensions/lnurldevice/views.py +++ b/lnbits/extensions/lnurldevice/views.py @@ -103,8 +103,8 @@ async def websocket_endpoint(websocket: WebSocket, lnurldevice_id: str): manager.disconnect(websocket) -async def updater(lnurldevice_id): +async def updater(lnurldevice_id, lnurldevice_pin): lnurldevice = await get_lnurldevice(lnurldevice_id) if not lnurldevice: return - await manager.send_personal_message(f"{lnurldevice.amount}", lnurldevice_id) + return await manager.send_personal_message(f"pin:{lnurldevice.pin},amount:{lnurldevice.amount}", lnurldevice_id) From 3552443f993d4cdf484912f72024401e767afa03 Mon Sep 17 00:00:00 2001 From: ben Date: Tue, 25 Oct 2022 11:10:34 +0100 Subject: [PATCH 02/21] adding migrations --- lnbits/extensions/lnurldevice/migrations.py | 25 +++++++++++++++++++++ lnbits/extensions/lnurldevice/models.py | 14 ++++++++++++ 2 files changed, 39 insertions(+) diff --git a/lnbits/extensions/lnurldevice/migrations.py b/lnbits/extensions/lnurldevice/migrations.py index 7305cceb..52ecba7e 100644 --- a/lnbits/extensions/lnurldevice/migrations.py +++ b/lnbits/extensions/lnurldevice/migrations.py @@ -88,3 +88,28 @@ async def m003_redux(db): await db.execute( "ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount INT DEFAULT 0;" ) + +async def m004_redux(db): + """ + Add 'meta' for storing various metadata about the wallet + """ + await db.execute( + """ + ALTER TABLE lnurldevice.lnurldevices ADD COLUMN ( + amount1, + amount2, + amount3, + amount4, + time, + time1, + time2, + time3, + time4, + pin1, + pin2, + pin3, + pin4, + ) + INT DEFAULT 0; + """ + ) \ No newline at end of file diff --git a/lnbits/extensions/lnurldevice/models.py b/lnbits/extensions/lnurldevice/models.py index 01bcc2ba..a4af4404 100644 --- a/lnbits/extensions/lnurldevice/models.py +++ b/lnbits/extensions/lnurldevice/models.py @@ -18,6 +18,20 @@ class createLnurldevice(BaseModel): device: str profit: float amount: int + amount1: int + amount2: int + amount3: int + amount4: int + pin: int + pin1: int + pin2: int + pin3: int + pin4: int + time: int + time1: int + time2: int + time3: int + time4: int class lnurldevices(BaseModel): From e88b18a41746c028b125a96fef4d8c2afd89e584 Mon Sep 17 00:00:00 2001 From: ben Date: Tue, 25 Oct 2022 12:09:40 +0100 Subject: [PATCH 03/21] added migrate --- lnbits/extensions/lnurldevice/crud.py | 30 ++- lnbits/extensions/lnurldevice/lnurl.py | 8 +- lnbits/extensions/lnurldevice/migrations.py | 37 ++-- lnbits/extensions/lnurldevice/models.py | 30 ++- lnbits/extensions/lnurldevice/tasks.py | 2 +- .../templates/lnurldevice/index.html | 189 ++++++++++++++++-- lnbits/extensions/lnurldevice/views.py | 4 +- 7 files changed, 241 insertions(+), 59 deletions(-) diff --git a/lnbits/extensions/lnurldevice/crud.py b/lnbits/extensions/lnurldevice/crud.py index 4c25e4cb..f9a13b58 100644 --- a/lnbits/extensions/lnurldevice/crud.py +++ b/lnbits/extensions/lnurldevice/crud.py @@ -23,9 +23,22 @@ async def create_lnurldevice( currency, device, profit, - amount + amount, + pin, + profit1, + amount1, + pin1, + profit2, + amount2, + pin2, + profit3, + amount3, + pin3, + profit4, + amount4, + pin4, ) - VALUES (?, ?, ?, ?, ?, ?, ?, ?) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """, ( lnurldevice_id, @@ -36,6 +49,19 @@ async def create_lnurldevice( data.device, data.profit, data.amount, + data.pin, + data.profit1, + data.amount1, + data.pin1, + data.profit2, + data.amount2, + data.pin2, + data.profit3, + data.amount3, + data.pin3, + data.profit4, + data.amount4, + data.pin4 ), ) return await get_lnurldevice(lnurldevice_id) diff --git a/lnbits/extensions/lnurldevice/lnurl.py b/lnbits/extensions/lnurldevice/lnurl.py index c83db6b8..72749e85 100644 --- a/lnbits/extensions/lnurldevice/lnurl.py +++ b/lnbits/extensions/lnurldevice/lnurl.py @@ -92,6 +92,8 @@ async def lnurl_v1_params( p: str = Query(None), atm: str = Query(None), gpio: str = Query(None), + profit: str = Query(None), + amount: str = Query(None), ): device = await get_lnurldevice(device_id) if not device: @@ -106,14 +108,14 @@ async def lnurl_v1_params( if device.device == "switch": price_msat = ( - await fiat_amount_as_satoshis(float(device.profit), device.currency) + await fiat_amount_as_satoshis(float(profit), device.currency) if device.currency != "sat" else amount_in_cent ) * 1000 lnurldevicepayment = await create_lnurldevicepayment( deviceid=device.id, - payload="bla", + payload=amount, sats=price_msat, pin=gpio, payhash="bla", @@ -237,7 +239,7 @@ async def lnurl_callback( amount=lnurldevicepayment.sats / 1000, memo=device.title + "-" + lnurldevicepayment.id, unhashed_description=(await device.lnurlpay_metadata()).encode("utf-8"), - extra={"tag": "Switch", "pin": ,"id": paymentid, "time": device.amount}, + extra={"tag": "Switch", "pin": lnurldevicepayment.pin,"amount": int(lnurldevicepayment.payload),"id": paymentid}, ) lnurldevicepayment = await update_lnurldevicepayment( lnurldevicepayment_id=paymentid, payhash=payment_hash diff --git a/lnbits/extensions/lnurldevice/migrations.py b/lnbits/extensions/lnurldevice/migrations.py index 52ecba7e..ebe45301 100644 --- a/lnbits/extensions/lnurldevice/migrations.py +++ b/lnbits/extensions/lnurldevice/migrations.py @@ -93,23 +93,20 @@ async def m004_redux(db): """ Add 'meta' for storing various metadata about the wallet """ - await db.execute( - """ - ALTER TABLE lnurldevice.lnurldevices ADD COLUMN ( - amount1, - amount2, - amount3, - amount4, - time, - time1, - time2, - time3, - time4, - pin1, - pin2, - pin3, - pin4, - ) - INT DEFAULT 0; - """ - ) \ No newline at end of file + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin INT DEFAULT 0") + + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit1 FLOAT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount1 INT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin1 INT DEFAULT 0") + + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit2 FLOAT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount2 INT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin2 INT DEFAULT 0") + + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit3 FLOAT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount3 INT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin3 INT DEFAULT 0") + + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit4 FLOAT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount4 INT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin4 INT DEFAULT 0") \ No newline at end of file diff --git a/lnbits/extensions/lnurldevice/models.py b/lnbits/extensions/lnurldevice/models.py index a4af4404..f4638bcd 100644 --- a/lnbits/extensions/lnurldevice/models.py +++ b/lnbits/extensions/lnurldevice/models.py @@ -18,20 +18,19 @@ class createLnurldevice(BaseModel): device: str profit: float amount: int - amount1: int - amount2: int - amount3: int - amount4: int pin: int + profit1: float + amount1: int pin1: int + profit2: float + amount2: int pin2: int + profit3: float + amount3: int pin3: int + profit4: float + amount4: int pin4: int - time: int - time1: int - time2: int - time3: int - time4: int class lnurldevices(BaseModel): @@ -43,6 +42,19 @@ class lnurldevices(BaseModel): device: str profit: float amount: int + pin: int + profit1: float + amount1: int + pin1: int + profit2: float + amount2: int + pin2: int + profit3: float + amount3: int + pin3: int + profit4: float + amount4: int + pin4: int timestamp: str def from_row(cls, row: Row) -> "lnurldevices": diff --git a/lnbits/extensions/lnurldevice/tasks.py b/lnbits/extensions/lnurldevice/tasks.py index 55cbaa98..2867577d 100644 --- a/lnbits/extensions/lnurldevice/tasks.py +++ b/lnbits/extensions/lnurldevice/tasks.py @@ -36,5 +36,5 @@ async def on_invoice_paid(payment: Payment) -> None: lnurldevicepayment = await update_lnurldevicepayment( lnurldevicepayment_id=payment.extra.get("id"), payhash="used" ) - return await updater(lnurldevicepayment.deviceid, lnurldevicepayment.pin) + return await updater(lnurldevicepayment.deviceid, lnurldevicepayment.pin, lnurldevicepayment.amount) return diff --git a/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html b/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html index 028dd94b..ae56c283 100644 --- a/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html +++ b/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html @@ -230,27 +230,167 @@ label="Profit margin (% added to invoices/deducted from faucets)" >
- - +

Switches

+ + + + + + + + + + +
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
@@ -338,6 +478,11 @@ wslocation: window.location.hostname, filter: '', currency: 'USD', + switch1: false, + switch2: false, + switch3: false, + switch4: false, + switch5: false, lnurldeviceLinks: [], lnurldeviceLinksObj: [], devices: [ @@ -592,7 +737,7 @@ LNbits.utils.notifyApiError(error) }) }, - clearFormDialoglnurldevice() { + clearFormDialoglnurldevice () { this.formDialoglnurldevice.data = { lnurl_toggle: false, show_message: false, diff --git a/lnbits/extensions/lnurldevice/views.py b/lnbits/extensions/lnurldevice/views.py index d17db7d7..d5d047af 100644 --- a/lnbits/extensions/lnurldevice/views.py +++ b/lnbits/extensions/lnurldevice/views.py @@ -103,8 +103,8 @@ async def websocket_endpoint(websocket: WebSocket, lnurldevice_id: str): manager.disconnect(websocket) -async def updater(lnurldevice_id, lnurldevice_pin): +async def updater(lnurldevice_id, lnurldevice_pin, lnurldevice_amount): lnurldevice = await get_lnurldevice(lnurldevice_id) if not lnurldevice: return - return await manager.send_personal_message(f"pin:{lnurldevice.pin},amount:{lnurldevice.amount}", lnurldevice_id) + return await manager.send_personal_message(f"pin:{lnurldevice_pin},amount:{lnurldevice_amount}", lnurldevice_id) From 7881125c71af913aa26844fb3a97a1e94ffa12db Mon Sep 17 00:00:00 2001 From: ben Date: Wed, 26 Oct 2022 10:54:46 +0100 Subject: [PATCH 04/21] Fixed migrate --- lnbits/extensions/lnurldevice/migrations.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lnbits/extensions/lnurldevice/migrations.py b/lnbits/extensions/lnurldevice/migrations.py index ebe45301..2ba5b0b3 100644 --- a/lnbits/extensions/lnurldevice/migrations.py +++ b/lnbits/extensions/lnurldevice/migrations.py @@ -94,19 +94,24 @@ async def m004_redux(db): Add 'meta' for storing various metadata about the wallet """ await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin INT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit FLOAT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit1 FLOAT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount1 INT DEFAULT 0") await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin1 INT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit1 FLOAT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit2 FLOAT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount2 INT DEFAULT 0") await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin2 INT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit2 FLOAT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit3 FLOAT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount3 INT DEFAULT 0") await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin3 INT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit3 FLOAT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit4 FLOAT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount4 INT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin4 INT DEFAULT 0") \ No newline at end of file + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin4 INT DEFAULT 0") + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit4 FLOAT DEFAULT 0") \ No newline at end of file From 1bfa28da19ad5585fdb113a4283e2cd8ad9be021 Mon Sep 17 00:00:00 2001 From: ben Date: Wed, 26 Oct 2022 10:58:13 +0100 Subject: [PATCH 05/21] reverted migrate --- lnbits/extensions/lnurldevice/migrations.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/lnbits/extensions/lnurldevice/migrations.py b/lnbits/extensions/lnurldevice/migrations.py index 2ba5b0b3..f29bca99 100644 --- a/lnbits/extensions/lnurldevice/migrations.py +++ b/lnbits/extensions/lnurldevice/migrations.py @@ -94,24 +94,20 @@ async def m004_redux(db): Add 'meta' for storing various metadata about the wallet """ await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin INT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit FLOAT DEFAULT 0") - + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit1 FLOAT DEFAULT 0") await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount1 INT DEFAULT 0") await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin1 INT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit1 FLOAT DEFAULT 0") - + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit2 FLOAT DEFAULT 0") await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount2 INT DEFAULT 0") await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin2 INT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit2 FLOAT DEFAULT 0") - + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit3 FLOAT DEFAULT 0") await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount3 INT DEFAULT 0") await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin3 INT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit3 FLOAT DEFAULT 0") - + await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit4 FLOAT DEFAULT 0") await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount4 INT DEFAULT 0") await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin4 INT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit4 FLOAT DEFAULT 0") \ No newline at end of file + \ No newline at end of file From 440c4b696671dc6809e81ee04c2c71236220b221 Mon Sep 17 00:00:00 2001 From: calle <93376500+callebtc@users.noreply.github.com> Date: Wed, 26 Oct 2022 12:56:15 +0200 Subject: [PATCH 06/21] Update issue templates (#1085) --- .github/ISSUE_TEMPLATE/bug_report.md | 31 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 +++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..bfaddbeb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,31 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG]" +labels: bug +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - LNbits version: [e.g. 0.9.2 or commit hash] + - Database [e.g. sqlite, postgres] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..4f49a497 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "[Feature request]" +labels: feature request +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From 2f1f92f1ee7465281cc57f2dd4e984b2c4d799b6 Mon Sep 17 00:00:00 2001 From: calle <93376500+callebtc@users.noreply.github.com> Date: Wed, 26 Oct 2022 12:57:53 +0200 Subject: [PATCH 07/21] Update issue templates (#1086) --- .github/ISSUE_TEMPLATE/something-else.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/something-else.md diff --git a/.github/ISSUE_TEMPLATE/something-else.md b/.github/ISSUE_TEMPLATE/something-else.md new file mode 100644 index 00000000..1b3b7355 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/something-else.md @@ -0,0 +1,10 @@ +--- +name: Something else +about: Describe this issue template's purpose here. +title: '' +labels: '' +assignees: '' + +--- + + From 1d9be9619f46018e8fce7889d268f63ea915cf43 Mon Sep 17 00:00:00 2001 From: calle <93376500+callebtc@users.noreply.github.com> Date: Wed, 26 Oct 2022 13:01:02 +0200 Subject: [PATCH 08/21] Update issue templates (#1087) --- .github/ISSUE_TEMPLATE/something-else.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/something-else.md b/.github/ISSUE_TEMPLATE/something-else.md index 1b3b7355..4bd9ec2a 100644 --- a/.github/ISSUE_TEMPLATE/something-else.md +++ b/.github/ISSUE_TEMPLATE/something-else.md @@ -1,6 +1,6 @@ --- name: Something else -about: Describe this issue template's purpose here. +about: Anything else that you need to say title: '' labels: '' assignees: '' From 7d736c3f77a1365a145de07da9cd8cc297091717 Mon Sep 17 00:00:00 2001 From: Lee Salminen Date: Wed, 26 Oct 2022 05:02:35 -0600 Subject: [PATCH 09/21] Add `FORWARDED_ALLOW_IPS` to example fly.io (#1082) This PR adds the needed `FORWARDED_ALLOW_IPS="*"` environment variable to the fly.io installation method, which is needed to work. --- docs/guide/installation.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/guide/installation.md b/docs/guide/installation.md index 6b95f93b..11ded8e8 100644 --- a/docs/guide/installation.md +++ b/docs/guide/installation.md @@ -155,6 +155,7 @@ kill_timeout = 30 HOST="127.0.0.1" PORT=5000 LNBITS_FORCE_HTTPS=true + FORWARDED_ALLOW_IPS="*" LNBITS_DATA_FOLDER="/data" ${PUT_YOUR_LNBITS_ENV_VARS_HERE} From 5a3524da8377d6706a171d31a9cd7d9aa0757bca Mon Sep 17 00:00:00 2001 From: rolznz <33993199+rolznz@users.noreply.github.com> Date: Wed, 26 Oct 2022 18:05:31 +0700 Subject: [PATCH 10/21] Fix usermanager API docs (#1073) - update incorrect response status codes - update invalid activate extension example --- .../templates/usermanager/_api_docs.html | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/lnbits/extensions/usermanager/templates/usermanager/_api_docs.html b/lnbits/extensions/usermanager/templates/usermanager/_api_docs.html index 886589e6..de477834 100644 --- a/lnbits/extensions/usermanager/templates/usermanager/_api_docs.html +++ b/lnbits/extensions/usermanager/templates/usermanager/_api_docs.html @@ -38,7 +38,7 @@ >
Body (application/json)
- Returns 201 CREATED (application/json) + Returns 200 OK (application/json)
JSON list of users
Curl example
@@ -57,10 +57,15 @@ /usermanager/api/v1/users/<user_id>
Body (application/json)
+
- Returns 201 CREATED (application/json) + Returns 200 OK (application/json)
- JSON list of users + {"id": <string>, "name": <string>, "admin": + <string>, "email": <string>, "password": <string>} +
Curl example
curl -X GET {{ request.base_url @@ -81,7 +86,7 @@ {"X-Api-Key": <string>}
Body (application/json)
- Returns 201 CREATED (application/json) + Returns 200 OK (application/json)
JSON wallet data
Curl example
@@ -104,7 +109,7 @@ {"X-Api-Key": <string>}
Body (application/json)
- Returns 201 CREATED (application/json) + Returns 200 OK (application/json)
JSON a wallets transactions
Curl example
@@ -254,11 +259,15 @@ {"X-Api-Key": <string>}
Curl example
curl -X POST {{ request.base_url }}usermanager/api/v1/extensions -d - '{"userid": <string>, "extension": <string>, "active": - <integer>}' -H "X-Api-Key: {{ user.wallets[0].inkey }}" -H + >curl -X POST {{ request.base_url }}usermanager/api/v1/extensions?extension=withdraw&userid=user_id&active=true -H "X-Api-Key: {{ user.wallets[0].inkey }}" -H "Content-type: application/json" +
+ Returns 200 OK (application/json) +
+ {"extension": "updated"} From d702e1b6a5bb6fe304f98236d0ddddddad223107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dni=20=E2=9A=A1?= Date: Wed, 26 Oct 2022 13:07:34 +0200 Subject: [PATCH 11/21] add FORWARDED_ALLOW_IPS variable to .example.env (#1077) --- .env.example | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index 987c6ca6..4edaea97 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,9 @@ HOST=127.0.0.1 PORT=5000 +# uvicorn variable, allow https behind a proxy +# FORWARDED_ALLOW_IPS="*" + DEBUG=false LNBITS_ALLOWED_USERS="" @@ -13,7 +16,7 @@ LNBITS_DEFAULT_WALLET_NAME="LNbits wallet" LNBITS_AD_SPACE="" # Hides wallet api, extensions can choose to honor -LNBITS_HIDE_API=false +LNBITS_HIDE_API=false # Disable extensions for all users, use "all" to disable all extensions LNBITS_DISABLED_EXTENSIONS="amilk" @@ -67,7 +70,7 @@ LNBITS_KEY=LNBITS_ADMIN_KEY LND_REST_ENDPOINT=https://127.0.0.1:8080/ LND_REST_CERT="/home/bob/.config/Zap/lnd/bitcoin/mainnet/wallet-1/data/chain/bitcoin/mainnet/tls.cert" LND_REST_MACAROON="/home/bob/.config/Zap/lnd/bitcoin/mainnet/wallet-1/data/chain/bitcoin/mainnet/admin.macaroon or HEXSTRING" -# To use an AES-encrypted macaroon, set +# To use an AES-encrypted macaroon, set # LND_REST_MACAROON_ENCRYPTED="eNcRyPtEdMaCaRoOn" # LNPayWallet From 937654e4f73e75b4f4446f1e7d15166fd89517ab Mon Sep 17 00:00:00 2001 From: ben Date: Wed, 26 Oct 2022 13:15:50 +0100 Subject: [PATCH 12/21] Fixed models --- lnbits/extensions/lnurldevice/crud.py | 2 +- lnbits/extensions/lnurldevice/models.py | 24 +-- .../templates/lnurldevice/index.html | 146 +++++++++++++----- 3 files changed, 124 insertions(+), 48 deletions(-) diff --git a/lnbits/extensions/lnurldevice/crud.py b/lnbits/extensions/lnurldevice/crud.py index f9a13b58..818b99fd 100644 --- a/lnbits/extensions/lnurldevice/crud.py +++ b/lnbits/extensions/lnurldevice/crud.py @@ -36,7 +36,7 @@ async def create_lnurldevice( pin3, profit4, amount4, - pin4, + pin4 ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """, diff --git a/lnbits/extensions/lnurldevice/models.py b/lnbits/extensions/lnurldevice/models.py index f4638bcd..62917632 100644 --- a/lnbits/extensions/lnurldevice/models.py +++ b/lnbits/extensions/lnurldevice/models.py @@ -19,18 +19,18 @@ class createLnurldevice(BaseModel): profit: float amount: int pin: int - profit1: float - amount1: int - pin1: int - profit2: float - amount2: int - pin2: int - profit3: float - amount3: int - pin3: int - profit4: float - amount4: int - pin4: int + profit1: float = 0 + amount1: int = 0 + pin1: int = 0 + profit2: float = 0 + amount2: int = 0 + pin2: int = 0 + profit3: float = 0 + amount3: int = 0 + pin3: int = 0 + profit4: float = 0 + amount4: int = 0 + pin4: int = 0 class lnurldevices(BaseModel): diff --git a/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html b/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html index ae56c283..72ea8082 100644 --- a/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html +++ b/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html @@ -105,7 +105,7 @@ @click="openQrCodeDialog(props.row.id)" > LNURLs only work over HTTPS view LNURL view LNURLS + + + + + + + + + + + + +
Mails
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. +
+ + +
Alarms
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. +
+ + +
Movies
+ Lorem ipsum dolor sit amet consectetur adipisicing elit. +
+
+ +
LNURLDevice device string
-

Switches

- - + + - - - - - -
- +
+
+ - +
+ - +
+ +
+
-
- +
+
+ - +
+ - +
+ +
+
-
- +
+
+ - +
+ - +
+ +
+
-
- +
+
+ - +
+ - +
+ +
+
-
- +
+
+ - +
+ - +
+ +
+
-
Date: Wed, 26 Oct 2022 20:19:04 +0100 Subject: [PATCH 13/21] Web socket working --- lnbits/extensions/lnurldevice/lnurl.py | 25 +++++-- lnbits/extensions/lnurldevice/models.py | 29 ++++++-- lnbits/extensions/lnurldevice/tasks.py | 2 +- .../templates/lnurldevice/index.html | 69 +++++-------------- lnbits/extensions/lnurldevice/views_api.py | 8 +-- 5 files changed, 64 insertions(+), 69 deletions(-) diff --git a/lnbits/extensions/lnurldevice/lnurl.py b/lnbits/extensions/lnurldevice/lnurl.py index 72749e85..37a4c57d 100644 --- a/lnbits/extensions/lnurldevice/lnurl.py +++ b/lnbits/extensions/lnurldevice/lnurl.py @@ -9,6 +9,7 @@ from embit import bech32, compact from fastapi import Request from fastapi.param_functions import Query from starlette.exceptions import HTTPException +from loguru import logger from lnbits.core.services import create_invoice from lnbits.core.views.api import pay_invoice @@ -113,6 +114,14 @@ async def lnurl_v1_params( else amount_in_cent ) * 1000 + # Check they're not trying to trick the switch! + check = False + for switch in device.switches(request): + if switch[0] == gpio and switch[1] == profit and switch[2] == amount: + check = True + if not check: + return {"status": "ERROR", "reason": f"Switch params wrong"} + lnurldevicepayment = await create_lnurldevicepayment( deviceid=device.id, payload=amount, @@ -129,7 +138,7 @@ async def lnurl_v1_params( ), "minSendable": price_msat, "maxSendable": price_msat, - "metadata": await device.lnurlpay_metadata(), + "metadata": device.lnurlpay_metadata, } if len(p) % 4 > 0: p += "=" * (4 - (len(p) % 4)) @@ -236,11 +245,17 @@ async def lnurl_callback( if device.device == "switch": payment_hash, payment_request = await create_invoice( wallet_id=device.wallet, - amount=lnurldevicepayment.sats / 1000, - memo=device.title + "-" + lnurldevicepayment.id, - unhashed_description=(await device.lnurlpay_metadata()).encode("utf-8"), - extra={"tag": "Switch", "pin": lnurldevicepayment.pin,"amount": int(lnurldevicepayment.payload),"id": paymentid}, + amount=int(lnurldevicepayment.sats / 1000), + memo=device.id + " PIN " + str(lnurldevicepayment.pin), + unhashed_description=device.lnurlpay_metadata.encode("utf-8"), + extra={ + "tag": "Switch", + "pin": str(lnurldevicepayment.pin), + "amount": str(lnurldevicepayment.payload), + "id": paymentid + }, ) + lnurldevicepayment = await update_lnurldevicepayment( lnurldevicepayment_id=paymentid, payhash=payment_hash ) diff --git a/lnbits/extensions/lnurldevice/models.py b/lnbits/extensions/lnurldevice/models.py index 62917632..ace22ca1 100644 --- a/lnbits/extensions/lnurldevice/models.py +++ b/lnbits/extensions/lnurldevice/models.py @@ -1,6 +1,6 @@ import json from sqlite3 import Row -from typing import Optional +from typing import Optional, List from fastapi import Request from lnurl import Lnurl @@ -9,7 +9,7 @@ from lnurl.models import LnurlPaySuccessAction, UrlAction # type: ignore from lnurl.types import LnurlPayMetadata # type: ignore from pydantic import BaseModel from pydantic.main import BaseModel - +from loguru import logger class createLnurldevice(BaseModel): title: str @@ -60,13 +60,28 @@ class lnurldevices(BaseModel): def from_row(cls, row: Row) -> "lnurldevices": return cls(**dict(row)) - def lnurl(self, req: Request) -> Lnurl: - url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id) - return lnurl_encode(url) - - async def lnurlpay_metadata(self) -> LnurlPayMetadata: + @property + def lnurlpay_metadata(self) -> LnurlPayMetadata: return LnurlPayMetadata(json.dumps([["text/plain", self.title]])) + def switches(self, req: Request) -> List: + switches = [] + if self.profit > 0: + url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id) + switches.append([str(self.pin), str(self.profit), str(self.amount), lnurl_encode(url + "?gpio=" + str(self.pin) + "&profit=" + str(self.profit) + "&amount=" + str(self.amount))]) + if self.profit1 > 0: + url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id) + switches.append([str(self.pin1), str(self.profit1), str(self.amount1), lnurl_encode(url + "?gpio=" + str(self.pin1) + "&profit=" + str(self.profit1) + "&amount=" + str(self.amount1))]) + if self.profit2 > 0: + url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id) + switches.append([str(self.pin2), str(self.profit2), str(self.amount2), lnurl_encode(url + "?gpio=" + str(self.pin2) + "&profit=" + str(self.profit2) + "&amount=" + str(self.amount2))]) + if self.profit3 > 0: + url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id) + switches.append([str(self.pin3), str(self.profit3), str(self.amount3), lnurl_encode(url + "?gpio=" + str(self.pin3) + "&profit=" + str(self.profit3) + "&amount=" + str(self.amount3))]) + if self.profit4 > 0: + url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id) + switches.append([str(self.pin4), str(self.profit4), str(self.amount4), lnurl_encode(url + "?gpio=" + str(self.pin4) + "&profit=" + str(self.profit4) + "&amount=" + str(self.amount4))]) + return switches class lnurldevicepayment(BaseModel): id: str diff --git a/lnbits/extensions/lnurldevice/tasks.py b/lnbits/extensions/lnurldevice/tasks.py index 2867577d..ca7aabb4 100644 --- a/lnbits/extensions/lnurldevice/tasks.py +++ b/lnbits/extensions/lnurldevice/tasks.py @@ -36,5 +36,5 @@ async def on_invoice_paid(payment: Payment) -> None: lnurldevicepayment = await update_lnurldevicepayment( lnurldevicepayment_id=payment.extra.get("id"), payhash="used" ) - return await updater(lnurldevicepayment.deviceid, lnurldevicepayment.pin, lnurldevicepayment.amount) + return await updater(lnurldevicepayment.deviceid, lnurldevicepayment.pin, lnurldevicepayment.payload) return diff --git a/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html b/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html index 72ea8082..17ce9f28 100644 --- a/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html +++ b/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html @@ -148,42 +148,6 @@ style="width: 700px; max-width: 80vw" class="q-pa-lg q-pt-xl lnbits__dialog-card" > - - - - - - - - - - - - -
Mails
- Lorem ipsum dolor sit amet consectetur adipisicing elit. -
- - -
Alarms
- Lorem ipsum dolor sit amet consectetur adipisicing elit. -
- - -
Movies
- Lorem ipsum dolor sit amet consectetur adipisicing elit. -
-
- -
LNURLDevice device string
+ - {% raw %} -

- ID: {{ qrCodeDialog.data.id }}
-

- {% endraw %} -
- Copy LNURL +
+
+ + Close
+
@@ -545,11 +508,13 @@ mixins: [windowMixin], data: function () { return { + tab: 'mails', protocol: window.location.protocol, location: window.location.hostname, wslocation: window.location.hostname, filter: '', currency: 'USD', + lnurlValue: '', switches: 0, lnurldeviceLinks: [], lnurldeviceLinksObj: [], @@ -599,12 +564,6 @@ label: 'device', field: 'device' }, - { - name: 'profit', - align: 'left', - label: 'profit', - field: 'profit' - }, { name: 'currency', align: 'left', @@ -653,8 +612,12 @@ this.qrCodeDialog.data = _.clone(lnurldevice) this.qrCodeDialog.data.url = window.location.protocol + '//' + window.location.host + this.lnurlValueFetch(this.qrCodeDialog.data.switches[0][3]) this.qrCodeDialog.show = true }, + lnurlValueFetch: function (lnurl){ + this.lnurlValue = lnurl + }, addSwitch: function () { var self = this self.switches = self.switches + 1 @@ -719,7 +682,9 @@ .then(function (response) { if (response.data) { self.lnurldeviceLinks = response.data.map(maplnurldevice) + console.log("response.data") console.log(response.data) + console.log("response.data") } }) .catch(function (error) { diff --git a/lnbits/extensions/lnurldevice/views_api.py b/lnbits/extensions/lnurldevice/views_api.py index c034f66e..c6766423 100644 --- a/lnbits/extensions/lnurldevice/views_api.py +++ b/lnbits/extensions/lnurldevice/views_api.py @@ -39,10 +39,10 @@ async def api_lnurldevice_create_or_update( ): if not lnurldevice_id: lnurldevice = await create_lnurldevice(data) - return {**lnurldevice.dict(), **{"lnurl": lnurldevice.lnurl(req)}} + return {**lnurldevice.dict(), **{"switches": lnurldevice.switches(req)}} else: lnurldevice = await update_lnurldevice(data, lnurldevice_id=lnurldevice_id) - return {**lnurldevice.dict(), **{"lnurl": lnurldevice.lnurl(req)}} + return {**lnurldevice.dict(), **{"switches": lnurldevice.switches(req)}} @lnurldevice_ext.get("/api/v1/lnurlpos") @@ -52,7 +52,7 @@ async def api_lnurldevices_retrieve( wallet_ids = (await get_user(wallet.wallet.user)).wallet_ids try: return [ - {**lnurldevice.dict(), **{"lnurl": lnurldevice.lnurl(req)}} + {**lnurldevice.dict(), **{"switches": lnurldevice.switches(req)}} for lnurldevice in await get_lnurldevices(wallet_ids) ] except: @@ -78,7 +78,7 @@ async def api_lnurldevice_retrieve( ) if not lnurldevice.lnurl_toggle: return {**lnurldevice.dict()} - return {**lnurldevice.dict(), **{"lnurl": lnurldevice.lnurl(req)}} + return {**lnurldevice.dict(), **{"switches": lnurldevice.switches(req)}} @lnurldevice_ext.delete("/api/v1/lnurlpos/{lnurldevice_id}") From 98d712fa7966e45a91563be66e3ced5d41b5b9bc Mon Sep 17 00:00:00 2001 From: ben Date: Thu, 27 Oct 2022 00:26:07 +0100 Subject: [PATCH 14/21] Fixed pin bug --- lnbits/extensions/lnurldevice/models.py | 2 +- lnbits/extensions/lnurldevice/views.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lnbits/extensions/lnurldevice/models.py b/lnbits/extensions/lnurldevice/models.py index ace22ca1..29d49d3f 100644 --- a/lnbits/extensions/lnurldevice/models.py +++ b/lnbits/extensions/lnurldevice/models.py @@ -18,7 +18,7 @@ class createLnurldevice(BaseModel): device: str profit: float amount: int - pin: int + pin: int = 0 profit1: float = 0 amount1: int = 0 pin1: int = 0 diff --git a/lnbits/extensions/lnurldevice/views.py b/lnbits/extensions/lnurldevice/views.py index d5d047af..f5fd598c 100644 --- a/lnbits/extensions/lnurldevice/views.py +++ b/lnbits/extensions/lnurldevice/views.py @@ -107,4 +107,4 @@ async def updater(lnurldevice_id, lnurldevice_pin, lnurldevice_amount): lnurldevice = await get_lnurldevice(lnurldevice_id) if not lnurldevice: return - return await manager.send_personal_message(f"pin:{lnurldevice_pin},amount:{lnurldevice_amount}", lnurldevice_id) + return await manager.send_personal_message(f"{lnurldevice_pin}-{lnurldevice_amount}", lnurldevice_id) From 5b1df5fffc02337f40b374fc9402900c17797c85 Mon Sep 17 00:00:00 2001 From: ben Date: Thu, 27 Oct 2022 00:35:49 +0100 Subject: [PATCH 15/21] fixed some ints --- lnbits/extensions/lnurldevice/lnurl.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lnbits/extensions/lnurldevice/lnurl.py b/lnbits/extensions/lnurldevice/lnurl.py index 37a4c57d..ce2d1c69 100644 --- a/lnbits/extensions/lnurldevice/lnurl.py +++ b/lnbits/extensions/lnurldevice/lnurl.py @@ -200,7 +200,7 @@ async def lnurl_v1_params( ), "minSendable": price_msat * 1000, "maxSendable": price_msat * 1000, - "metadata": await device.lnurlpay_metadata(), + "metadata": device.lnurlpay_metadata, } @@ -266,9 +266,9 @@ async def lnurl_callback( payment_hash, payment_request = await create_invoice( wallet_id=device.wallet, - amount=lnurldevicepayment.sats / 1000, + amount=int(lnurldevicepayment.sats / 1000), memo=device.title, - unhashed_description=(await device.lnurlpay_metadata()).encode("utf-8"), + unhashed_description=device.lnurlpay_metadata.encode("utf-8"), extra={"tag": "PoS"}, ) lnurldevicepayment = await update_lnurldevicepayment( From 047d0fc761097d868c494009adde91bb39f86913 Mon Sep 17 00:00:00 2001 From: ben Date: Thu, 27 Oct 2022 00:37:15 +0100 Subject: [PATCH 16/21] black --- lnbits/extensions/lnurldevice/crud.py | 2 +- lnbits/extensions/lnurldevice/lnurl.py | 10 +-- lnbits/extensions/lnurldevice/migrations.py | 60 ++++++++++---- lnbits/extensions/lnurldevice/models.py | 87 +++++++++++++++++++-- lnbits/extensions/lnurldevice/tasks.py | 6 +- lnbits/extensions/lnurldevice/views.py | 4 +- 6 files changed, 139 insertions(+), 30 deletions(-) diff --git a/lnbits/extensions/lnurldevice/crud.py b/lnbits/extensions/lnurldevice/crud.py index 818b99fd..e02d23b8 100644 --- a/lnbits/extensions/lnurldevice/crud.py +++ b/lnbits/extensions/lnurldevice/crud.py @@ -61,7 +61,7 @@ async def create_lnurldevice( data.pin3, data.profit4, data.amount4, - data.pin4 + data.pin4, ), ) return await get_lnurldevice(lnurldevice_id) diff --git a/lnbits/extensions/lnurldevice/lnurl.py b/lnbits/extensions/lnurldevice/lnurl.py index ce2d1c69..6a80f74e 100644 --- a/lnbits/extensions/lnurldevice/lnurl.py +++ b/lnbits/extensions/lnurldevice/lnurl.py @@ -9,7 +9,7 @@ from embit import bech32, compact from fastapi import Request from fastapi.param_functions import Query from starlette.exceptions import HTTPException -from loguru import logger +from loguru import logger from lnbits.core.services import create_invoice from lnbits.core.views.api import pay_invoice @@ -249,13 +249,13 @@ async def lnurl_callback( memo=device.id + " PIN " + str(lnurldevicepayment.pin), unhashed_description=device.lnurlpay_metadata.encode("utf-8"), extra={ - "tag": "Switch", + "tag": "Switch", "pin": str(lnurldevicepayment.pin), "amount": str(lnurldevicepayment.payload), - "id": paymentid - }, + "id": paymentid, + }, ) - + lnurldevicepayment = await update_lnurldevicepayment( lnurldevicepayment_id=paymentid, payhash=payment_hash ) diff --git a/lnbits/extensions/lnurldevice/migrations.py b/lnbits/extensions/lnurldevice/migrations.py index f29bca99..1df04075 100644 --- a/lnbits/extensions/lnurldevice/migrations.py +++ b/lnbits/extensions/lnurldevice/migrations.py @@ -89,25 +89,51 @@ async def m003_redux(db): "ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount INT DEFAULT 0;" ) + async def m004_redux(db): """ Add 'meta' for storing various metadata about the wallet """ - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin INT DEFAULT 0") - - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit1 FLOAT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount1 INT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin1 INT DEFAULT 0") + await db.execute( + "ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin INT DEFAULT 0" + ) - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit2 FLOAT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount2 INT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin2 INT DEFAULT 0") - - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit3 FLOAT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount3 INT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin3 INT DEFAULT 0") - - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit4 FLOAT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount4 INT DEFAULT 0") - await db.execute("ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin4 INT DEFAULT 0") - \ No newline at end of file + await db.execute( + "ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit1 FLOAT DEFAULT 0" + ) + await db.execute( + "ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount1 INT DEFAULT 0" + ) + await db.execute( + "ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin1 INT DEFAULT 0" + ) + + await db.execute( + "ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit2 FLOAT DEFAULT 0" + ) + await db.execute( + "ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount2 INT DEFAULT 0" + ) + await db.execute( + "ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin2 INT DEFAULT 0" + ) + + await db.execute( + "ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit3 FLOAT DEFAULT 0" + ) + await db.execute( + "ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount3 INT DEFAULT 0" + ) + await db.execute( + "ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin3 INT DEFAULT 0" + ) + + await db.execute( + "ALTER TABLE lnurldevice.lnurldevices ADD COLUMN profit4 FLOAT DEFAULT 0" + ) + await db.execute( + "ALTER TABLE lnurldevice.lnurldevices ADD COLUMN amount4 INT DEFAULT 0" + ) + await db.execute( + "ALTER TABLE lnurldevice.lnurldevices ADD COLUMN pin4 INT DEFAULT 0" + ) diff --git a/lnbits/extensions/lnurldevice/models.py b/lnbits/extensions/lnurldevice/models.py index 29d49d3f..1b7c0ab8 100644 --- a/lnbits/extensions/lnurldevice/models.py +++ b/lnbits/extensions/lnurldevice/models.py @@ -11,6 +11,7 @@ from pydantic import BaseModel from pydantic.main import BaseModel from loguru import logger + class createLnurldevice(BaseModel): title: str wallet: str @@ -68,21 +69,97 @@ class lnurldevices(BaseModel): switches = [] if self.profit > 0: url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id) - switches.append([str(self.pin), str(self.profit), str(self.amount), lnurl_encode(url + "?gpio=" + str(self.pin) + "&profit=" + str(self.profit) + "&amount=" + str(self.amount))]) + switches.append( + [ + str(self.pin), + str(self.profit), + str(self.amount), + lnurl_encode( + url + + "?gpio=" + + str(self.pin) + + "&profit=" + + str(self.profit) + + "&amount=" + + str(self.amount) + ), + ] + ) if self.profit1 > 0: url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id) - switches.append([str(self.pin1), str(self.profit1), str(self.amount1), lnurl_encode(url + "?gpio=" + str(self.pin1) + "&profit=" + str(self.profit1) + "&amount=" + str(self.amount1))]) + switches.append( + [ + str(self.pin1), + str(self.profit1), + str(self.amount1), + lnurl_encode( + url + + "?gpio=" + + str(self.pin1) + + "&profit=" + + str(self.profit1) + + "&amount=" + + str(self.amount1) + ), + ] + ) if self.profit2 > 0: url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id) - switches.append([str(self.pin2), str(self.profit2), str(self.amount2), lnurl_encode(url + "?gpio=" + str(self.pin2) + "&profit=" + str(self.profit2) + "&amount=" + str(self.amount2))]) + switches.append( + [ + str(self.pin2), + str(self.profit2), + str(self.amount2), + lnurl_encode( + url + + "?gpio=" + + str(self.pin2) + + "&profit=" + + str(self.profit2) + + "&amount=" + + str(self.amount2) + ), + ] + ) if self.profit3 > 0: url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id) - switches.append([str(self.pin3), str(self.profit3), str(self.amount3), lnurl_encode(url + "?gpio=" + str(self.pin3) + "&profit=" + str(self.profit3) + "&amount=" + str(self.amount3))]) + switches.append( + [ + str(self.pin3), + str(self.profit3), + str(self.amount3), + lnurl_encode( + url + + "?gpio=" + + str(self.pin3) + + "&profit=" + + str(self.profit3) + + "&amount=" + + str(self.amount3) + ), + ] + ) if self.profit4 > 0: url = req.url_for("lnurldevice.lnurl_v1_params", device_id=self.id) - switches.append([str(self.pin4), str(self.profit4), str(self.amount4), lnurl_encode(url + "?gpio=" + str(self.pin4) + "&profit=" + str(self.profit4) + "&amount=" + str(self.amount4))]) + switches.append( + [ + str(self.pin4), + str(self.profit4), + str(self.amount4), + lnurl_encode( + url + + "?gpio=" + + str(self.pin4) + + "&profit=" + + str(self.profit4) + + "&amount=" + + str(self.amount4) + ), + ] + ) return switches + class lnurldevicepayment(BaseModel): id: str deviceid: str diff --git a/lnbits/extensions/lnurldevice/tasks.py b/lnbits/extensions/lnurldevice/tasks.py index ca7aabb4..d3248ad5 100644 --- a/lnbits/extensions/lnurldevice/tasks.py +++ b/lnbits/extensions/lnurldevice/tasks.py @@ -36,5 +36,9 @@ async def on_invoice_paid(payment: Payment) -> None: lnurldevicepayment = await update_lnurldevicepayment( lnurldevicepayment_id=payment.extra.get("id"), payhash="used" ) - return await updater(lnurldevicepayment.deviceid, lnurldevicepayment.pin, lnurldevicepayment.payload) + return await updater( + lnurldevicepayment.deviceid, + lnurldevicepayment.pin, + lnurldevicepayment.payload, + ) return diff --git a/lnbits/extensions/lnurldevice/views.py b/lnbits/extensions/lnurldevice/views.py index f5fd598c..f435931b 100644 --- a/lnbits/extensions/lnurldevice/views.py +++ b/lnbits/extensions/lnurldevice/views.py @@ -107,4 +107,6 @@ async def updater(lnurldevice_id, lnurldevice_pin, lnurldevice_amount): lnurldevice = await get_lnurldevice(lnurldevice_id) if not lnurldevice: return - return await manager.send_personal_message(f"{lnurldevice_pin}-{lnurldevice_amount}", lnurldevice_id) + return await manager.send_personal_message( + f"{lnurldevice_pin}-{lnurldevice_amount}", lnurldevice_id + ) From 1ab0d0f70132ce5d75f41d4ecb3df37135695a4b Mon Sep 17 00:00:00 2001 From: ben Date: Thu, 27 Oct 2022 01:05:09 +0100 Subject: [PATCH 17/21] isort --- lnbits/extensions/lnurldevice/lnurl.py | 12 ++++-------- lnbits/extensions/lnurldevice/models.py | 4 ++-- lnbits/extensions/lnurldevice/tasks.py | 3 ++- lnbits/extensions/lnurldevice/views_api.py | 9 ++------- 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/lnbits/extensions/lnurldevice/lnurl.py b/lnbits/extensions/lnurldevice/lnurl.py index 6a80f74e..bdbcbdaa 100644 --- a/lnbits/extensions/lnurldevice/lnurl.py +++ b/lnbits/extensions/lnurldevice/lnurl.py @@ -8,21 +8,17 @@ from typing import Optional from embit import bech32, compact from fastapi import Request from fastapi.param_functions import Query -from starlette.exceptions import HTTPException from loguru import logger +from starlette.exceptions import HTTPException from lnbits.core.services import create_invoice from lnbits.core.views.api import pay_invoice from lnbits.utils.exchange_rates import fiat_amount_as_satoshis from . import lnurldevice_ext -from .crud import ( - create_lnurldevicepayment, - get_lnurldevice, - get_lnurldevicepayment, - get_lnurlpayload, - update_lnurldevicepayment, -) +from .crud import (create_lnurldevicepayment, get_lnurldevice, + get_lnurldevicepayment, get_lnurlpayload, + update_lnurldevicepayment) def bech32_decode(bech): diff --git a/lnbits/extensions/lnurldevice/models.py b/lnbits/extensions/lnurldevice/models.py index 1b7c0ab8..c27470b7 100644 --- a/lnbits/extensions/lnurldevice/models.py +++ b/lnbits/extensions/lnurldevice/models.py @@ -1,15 +1,15 @@ import json from sqlite3 import Row -from typing import Optional, List +from typing import List, Optional from fastapi import Request from lnurl import Lnurl from lnurl import encode as lnurl_encode # type: ignore from lnurl.models import LnurlPaySuccessAction, UrlAction # type: ignore from lnurl.types import LnurlPayMetadata # type: ignore +from loguru import logger from pydantic import BaseModel from pydantic.main import BaseModel -from loguru import logger class createLnurldevice(BaseModel): diff --git a/lnbits/extensions/lnurldevice/tasks.py b/lnbits/extensions/lnurldevice/tasks.py index d3248ad5..2c2ac713 100644 --- a/lnbits/extensions/lnurldevice/tasks.py +++ b/lnbits/extensions/lnurldevice/tasks.py @@ -12,7 +12,8 @@ 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 diff --git a/lnbits/extensions/lnurldevice/views_api.py b/lnbits/extensions/lnurldevice/views_api.py index c6766423..d0ea8659 100644 --- a/lnbits/extensions/lnurldevice/views_api.py +++ b/lnbits/extensions/lnurldevice/views_api.py @@ -11,13 +11,8 @@ from lnbits.extensions.lnurldevice import lnurldevice_ext from lnbits.utils.exchange_rates import currencies from . import lnurldevice_ext -from .crud import ( - create_lnurldevice, - delete_lnurldevice, - get_lnurldevice, - get_lnurldevices, - update_lnurldevice, -) +from .crud import (create_lnurldevice, delete_lnurldevice, get_lnurldevice, + get_lnurldevices, update_lnurldevice) from .models import createLnurldevice From 8bafb9ab1992deaa7c9fe4c0cf9e01263ec10703 Mon Sep 17 00:00:00 2001 From: ben Date: Thu, 27 Oct 2022 01:10:03 +0100 Subject: [PATCH 18/21] black --- lnbits/extensions/lnurldevice/lnurl.py | 10 +++++++--- lnbits/extensions/lnurldevice/tasks.py | 3 +-- lnbits/extensions/lnurldevice/views_api.py | 9 +++++++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/lnbits/extensions/lnurldevice/lnurl.py b/lnbits/extensions/lnurldevice/lnurl.py index bdbcbdaa..c8f9675e 100644 --- a/lnbits/extensions/lnurldevice/lnurl.py +++ b/lnbits/extensions/lnurldevice/lnurl.py @@ -16,9 +16,13 @@ from lnbits.core.views.api import pay_invoice from lnbits.utils.exchange_rates import fiat_amount_as_satoshis from . import lnurldevice_ext -from .crud import (create_lnurldevicepayment, get_lnurldevice, - get_lnurldevicepayment, get_lnurlpayload, - update_lnurldevicepayment) +from .crud import ( + create_lnurldevicepayment, + get_lnurldevice, + get_lnurldevicepayment, + get_lnurlpayload, + update_lnurldevicepayment, +) def bech32_decode(bech): diff --git a/lnbits/extensions/lnurldevice/tasks.py b/lnbits/extensions/lnurldevice/tasks.py index 2c2ac713..d3248ad5 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 diff --git a/lnbits/extensions/lnurldevice/views_api.py b/lnbits/extensions/lnurldevice/views_api.py index d0ea8659..c6766423 100644 --- a/lnbits/extensions/lnurldevice/views_api.py +++ b/lnbits/extensions/lnurldevice/views_api.py @@ -11,8 +11,13 @@ from lnbits.extensions.lnurldevice import lnurldevice_ext from lnbits.utils.exchange_rates import currencies from . import lnurldevice_ext -from .crud import (create_lnurldevice, delete_lnurldevice, get_lnurldevice, - get_lnurldevices, update_lnurldevice) +from .crud import ( + create_lnurldevice, + delete_lnurldevice, + get_lnurldevice, + get_lnurldevices, + update_lnurldevice, +) from .models import createLnurldevice From 904dea37fc25641f3c283a3850af22474700d751 Mon Sep 17 00:00:00 2001 From: ben Date: Thu, 27 Oct 2022 01:16:05 +0100 Subject: [PATCH 19/21] prettier --- .../templates/lnurldevice/index.html | 317 ++++++++++-------- 1 file changed, 168 insertions(+), 149 deletions(-) diff --git a/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html b/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html index 17ce9f28..83ff4571 100644 --- a/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html +++ b/lnbits/extensions/lnurldevice/templates/lnurldevice/index.html @@ -230,201 +230,217 @@ label="Profit margin (% added to invoices/deducted from faucets)" >
- - - - + +
-
+
+ ref="setAmount" + filled + dense + v-model.trim="formDialoglnurldevice.data.profit" + class="q-pb-md" + :label="'Amount (' + formDialoglnurldevice.data.currency + ') *'" + :mask="'#.##'" + fill-mask="0" + reverse-fill-mask + :step="'0.01'" + value="0.00" + >
+ filled + dense + v-model.trim="formDialoglnurldevice.data.amount" + type="number" + value="1000" + label="milesecs to turn Switch on for (1sec = 1000ms)" + >
+ filled + dense + v-model.trim="formDialoglnurldevice.data.pin" + type="number" + label="GPIO to turn on" + >
-
+
+ ref="setAmount" + filled + dense + v-model.trim="formDialoglnurldevice.data.profit1" + class="q-pb-md" + :label="'Amount (' + formDialoglnurldevice.data.currency + ') *'" + :mask="'#.##'" + fill-mask="0" + reverse-fill-mask + :step="'0.01'" + value="0.00" + >
+ filled + dense + v-model.trim="formDialoglnurldevice.data.amount1" + type="number" + value="1000" + label="milesecs to turn Switch on for (1sec = 1000ms)" + >
+ filled + dense + v-model.trim="formDialoglnurldevice.data.pin1" + type="number" + label="GPIO to turn on" + >
-
+
+ ref="setAmount" + filled + dense + v-model.trim="formDialoglnurldevice.data.profit2" + class="q-pb-md" + :label="'Amount (' + formDialoglnurldevice.data.currency + ') *'" + :mask="'#.##'" + fill-mask="0" + reverse-fill-mask + :step="'0.01'" + value="0.00" + >
+ filled + dense + v-model.trim="formDialoglnurldevice.data.amount2" + type="number" + value="1000" + label="milesecs to turn Switch on for (1sec = 1000ms)" + >
+ filled + dense + v-model.trim="formDialoglnurldevice.data.pin2" + type="number" + label="GPIO to turn on" + >
-
+
-
+
+ ref="setAmount" + filled + dense + v-model.trim="formDialoglnurldevice.data.profit3" + class="q-pb-md" + :label="'Amount (' + formDialoglnurldevice.data.currency + ') *'" + :mask="'#.##'" + fill-mask="0" + reverse-fill-mask + :step="'0.01'" + value="0.00" + >
+ filled + dense + v-model.trim="formDialoglnurldevice.data.amount3" + type="number" + value="1000" + label="milesecs to turn Switch on for (1sec = 1000ms)" + >
+ filled + dense + v-model.trim="formDialoglnurldevice.data.pin3" + type="number" + label="GPIO to turn on" + >
-
+
-
+
+ ref="setAmount" + filled + dense + v-model.trim="formDialoglnurldevice.data.profit4" + class="q-pb-md" + :label="'Amount (' + formDialoglnurldevice.data.currency + ') *'" + :mask="'#.##'" + fill-mask="0" + reverse-fill-mask + :step="'0.01'" + value="0.00" + >
+ filled + dense + v-model.trim="formDialoglnurldevice.data.amount4" + type="number" + value="1000" + label="milesecs to turn Switch on for (1sec = 1000ms)" + >
+ filled + dense + v-model.trim="formDialoglnurldevice.data.pin4" + type="number" + label="GPIO to turn on" + >
@@ -458,7 +474,6 @@ - Copy LNURL -
+ outline + color="grey" + @click="copyText(lnurlValue, 'LNURL copied to clipboard!')" + >Copy LNURL +
- - + Close
-
@@ -615,7 +634,7 @@ this.lnurlValueFetch(this.qrCodeDialog.data.switches[0][3]) this.qrCodeDialog.show = true }, - lnurlValueFetch: function (lnurl){ + lnurlValueFetch: function (lnurl) { this.lnurlValue = lnurl }, addSwitch: function () { @@ -682,9 +701,9 @@ .then(function (response) { if (response.data) { self.lnurldeviceLinks = response.data.map(maplnurldevice) - console.log("response.data") + console.log('response.data') console.log(response.data) - console.log("response.data") + console.log('response.data') } }) .catch(function (error) { From 7be45d5d912a94b704178298c715676c8f484418 Mon Sep 17 00:00:00 2001 From: Arc <33088785+arcbtc@users.noreply.github.com> Date: Fri, 28 Oct 2022 10:22:59 +0100 Subject: [PATCH 20/21] Update installation.md --- docs/guide/installation.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/guide/installation.md b/docs/guide/installation.md index 11ded8e8..bf40418d 100644 --- a/docs/guide/installation.md +++ b/docs/guide/installation.md @@ -48,7 +48,9 @@ poetry run lnbits # Note that you have to add the line DEBUG=true in your .env file, too. ``` -## Option 2: Nix +## Option 2: Nix + +> note: currently not supported while we make some architectural changes on the path to leave beta ```sh git clone https://github.com/lnbits/lnbits-legend.git From b92fedbcc9f22415ed7b34d26a83e1c4f2ce8864 Mon Sep 17 00:00:00 2001 From: calle <93376500+callebtc@users.noreply.github.com> Date: Fri, 28 Oct 2022 11:26:02 +0200 Subject: [PATCH 21/21] refactor try except block (#1084) --- lnbits/extensions/withdraw/lnurl.py | 55 +++++++++++++++-------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/lnbits/extensions/withdraw/lnurl.py b/lnbits/extensions/withdraw/lnurl.py index 18a99599..660e5b7d 100644 --- a/lnbits/extensions/withdraw/lnurl.py +++ b/lnbits/extensions/withdraw/lnurl.py @@ -78,34 +78,35 @@ async def api_lnurl_callback( return {"status": "ERROR", "reason": f"Wait {link.open_time - now} seconds."} usescsv = "" + + for x in range(1, link.uses - link.used): + usecv = link.usescsv.split(",") + usescsv += "," + str(usecv[x]) + usecsvback = usescsv + + found = False + if id_unique_hash is not None: + useslist = link.usescsv.split(",") + for ind, x in enumerate(useslist): + tohash = link.id + link.unique_hash + str(x) + if id_unique_hash == shortuuid.uuid(name=tohash): + found = True + useslist.pop(ind) + usescsv = ",".join(useslist) + if not found: + raise HTTPException( + status_code=HTTPStatus.NOT_FOUND, detail="LNURL-withdraw not found." + ) + else: + usescsv = usescsv[1:] + + changesback = { + "open_time": link.wait_time, + "used": link.used, + "usescsv": usecsvback, + } + try: - for x in range(1, link.uses - link.used): - usecv = link.usescsv.split(",") - usescsv += "," + str(usecv[x]) - usecsvback = usescsv - - found = False - if id_unique_hash is not None: - useslist = link.usescsv.split(",") - for ind, x in enumerate(useslist): - tohash = link.id + link.unique_hash + str(x) - if id_unique_hash == shortuuid.uuid(name=tohash): - found = True - useslist.pop(ind) - usescsv = ",".join(useslist) - if not found: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="LNURL-withdraw not found." - ) - else: - usescsv = usescsv[1:] - - changesback = { - "open_time": link.wait_time, - "used": link.used, - "usescsv": usecsvback, - } - changes = { "open_time": link.wait_time + now, "used": link.used + 1,