From fbafe2b8f1989b9f793f294983cbf7a612bcfbd1 Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Mon, 21 Feb 2022 09:17:36 +0100 Subject: [PATCH 01/16] Retry backend connection on startup --- lnbits/app.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lnbits/app.py b/lnbits/app.py index 64e4ba4e1..0043ba651 100644 --- a/lnbits/app.py +++ b/lnbits/app.py @@ -84,18 +84,20 @@ def create_app(config_object="lnbits.settings") -> FastAPI: def check_funding_source(app: FastAPI) -> None: @app.on_event("startup") async def check_wallet_status(): - error_message, balance = await WALLET.status() - if error_message: + success = False + while not success: + error_message, balance = await WALLET.status() + if not error_message: + break warnings.warn( f" × The backend for {WALLET.__class__.__name__} isn't working properly: '{error_message}'", RuntimeWarning, ) - - sys.exit(4) - else: - print( - f" ✔️ {WALLET.__class__.__name__} seems to be connected and with a balance of {balance} msat." - ) + print("Retrying connection to backend in 5 seconds...") + await asyncio.sleep(5) + print( + f" ✔️ {WALLET.__class__.__name__} seems to be connected and with a balance of {balance} msat." + ) def register_routes(app: FastAPI) -> None: From 36952981c21ee235d5997155bf29e2ba2de712b2 Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Mon, 21 Feb 2022 09:25:45 +0100 Subject: [PATCH 02/16] remove success var --- lnbits/app.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lnbits/app.py b/lnbits/app.py index 0043ba651..ca7701677 100644 --- a/lnbits/app.py +++ b/lnbits/app.py @@ -84,8 +84,7 @@ def create_app(config_object="lnbits.settings") -> FastAPI: def check_funding_source(app: FastAPI) -> None: @app.on_event("startup") async def check_wallet_status(): - success = False - while not success: + while True: error_message, balance = await WALLET.status() if not error_message: break From eb7b369b6df940d46c70cd52778f0ebdc954c285 Mon Sep 17 00:00:00 2001 From: Tiago vasconcelos Date: Tue, 22 Feb 2022 16:45:35 +0000 Subject: [PATCH 03/16] fix payments decode --- lnbits/core/views/api.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/lnbits/core/views/api.py b/lnbits/core/views/api.py index d607e1492..151eac380 100644 --- a/lnbits/core/views/api.py +++ b/lnbits/core/views/api.py @@ -24,24 +24,24 @@ from lnbits.decorators import ( WalletTypeInfo, get_key_type, ) -from lnbits.helpers import url_for +from lnbits.helpers import url_for, urlsafe_short_hash from lnbits.requestvars import g +from lnbits.settings import LNBITS_ADMIN_USERS, LNBITS_SITE_TITLE from lnbits.utils.exchange_rates import ( currencies, fiat_amount_as_satoshis, satoshis_amount_as_fiat, ) -from lnbits.settings import LNBITS_SITE_TITLE from .. import core_app, db from ..crud import ( + create_payment, get_payments, get_standalone_payment, - save_balance_check, - update_wallet, - create_payment, get_wallet, + save_balance_check, update_payment_status, + update_wallet, ) from ..services import ( InvoiceFailure, @@ -52,8 +52,6 @@ from ..services import ( perform_lnurlauth, ) from ..tasks import api_invoice_listeners -from lnbits.settings import LNBITS_ADMIN_USERS -from lnbits.helpers import urlsafe_short_hash @core_app.get("/api/v1/wallet") @@ -503,12 +501,13 @@ async def api_lnurlscan(code: str): @core_app.post("/api/v1/payments/decode") async def api_payments_decode(data: str = Query(None)): + print(data) try: - if data["data"][:5] == "LNURL": - url = lnurl.decode(data["data"]) + if data[:5] == "LNURL": + url = lnurl.decode(data) return {"domain": url} else: - invoice = bolt11.decode(data["data"]) + invoice = bolt11.decode(data) return { "payment_hash": invoice.payment_hash, "amount_msat": invoice.amount_msat, From 510a28f3d05d5b1ad839a7d73cf7fe5f8e289e97 Mon Sep 17 00:00:00 2001 From: Tiago vasconcelos Date: Tue, 22 Feb 2022 20:38:35 +0000 Subject: [PATCH 04/16] create_charge data --- lnbits/extensions/streamalerts/views_api.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lnbits/extensions/streamalerts/views_api.py b/lnbits/extensions/streamalerts/views_api.py index e19abd731..177803d4f 100644 --- a/lnbits/extensions/streamalerts/views_api.py +++ b/lnbits/extensions/streamalerts/views_api.py @@ -7,6 +7,7 @@ from starlette.responses import RedirectResponse from lnbits.core.crud import get_user from lnbits.decorators import WalletTypeInfo, get_key_type +from lnbits.extensions.satspay.models import CreateCharge from lnbits.extensions.streamalerts.models import ( CreateDonation, CreateService, @@ -116,14 +117,15 @@ async def api_create_donation(data: CreateDonation, request: Request): name = data.name description = f"{sats} sats donation from {name} to {service.twitchuser}" - charge = await create_charge( + create_charge_data = CreateCharge( amount=sats, completelink=f"https://twitch.tv/{service.twitchuser}", completelinktext="Back to Stream!", webhook=webhook_base + "/streamalerts/api/v1/postdonation", description=description, - **charge_details, + **charge_details ) + charge = await create_charge(user=charge_details["user"], data=data) await create_donation( id=charge.id, wallet=service.wallet, From 71e11b73875b284dd5c098b794a3cb45de2dbb4d Mon Sep 17 00:00:00 2001 From: Tiago vasconcelos Date: Tue, 22 Feb 2022 21:12:46 +0000 Subject: [PATCH 05/16] fix typo --- lnbits/extensions/streamalerts/views_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lnbits/extensions/streamalerts/views_api.py b/lnbits/extensions/streamalerts/views_api.py index 177803d4f..fa7ff7d26 100644 --- a/lnbits/extensions/streamalerts/views_api.py +++ b/lnbits/extensions/streamalerts/views_api.py @@ -125,7 +125,7 @@ async def api_create_donation(data: CreateDonation, request: Request): description=description, **charge_details ) - charge = await create_charge(user=charge_details["user"], data=data) + charge = await create_charge(user=charge_details["user"], data=create_charge_data) await create_donation( id=charge.id, wallet=service.wallet, From 8930152b0fa0d8600db561160fbf323a79f761c8 Mon Sep 17 00:00:00 2001 From: Tiago vasconcelos Date: Tue, 22 Feb 2022 21:22:07 +0000 Subject: [PATCH 06/16] fix models int to str --- lnbits/extensions/streamalerts/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lnbits/extensions/streamalerts/models.py b/lnbits/extensions/streamalerts/models.py index 6511e916b..4a365cbaa 100644 --- a/lnbits/extensions/streamalerts/models.py +++ b/lnbits/extensions/streamalerts/models.py @@ -60,7 +60,7 @@ class Service(BaseModel): onchain: Optional[str] servicename: str # Currently, this will just always be "Streamlabs" authenticated: bool # Whether a token (see below) has been acquired yet - token: Optional[int] # The token with which to authenticate requests + token: Optional[str] # The token with which to authenticate requests @classmethod def from_row(cls, row: Row) -> "Service": From a374526fafd83fe1b84edff71c8580f8a715060a Mon Sep 17 00:00:00 2001 From: Tiago vasconcelos Date: Wed, 23 Feb 2022 10:13:52 +0000 Subject: [PATCH 07/16] make Anonymous default name --- .../extensions/streamalerts/templates/streamalerts/display.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lnbits/extensions/streamalerts/templates/streamalerts/display.html b/lnbits/extensions/streamalerts/templates/streamalerts/display.html index a10e64d88..8a0b2d590 100644 --- a/lnbits/extensions/streamalerts/templates/streamalerts/display.html +++ b/lnbits/extensions/streamalerts/templates/streamalerts/display.html @@ -62,7 +62,7 @@ donationDialog: { show: false, data: { - name: '', + name: null, sats: '', message: '' } From 270cac37ac92944787b6e307997d9a1b7571269f Mon Sep 17 00:00:00 2001 From: Tiago vasconcelos Date: Wed, 23 Feb 2022 10:37:15 +0000 Subject: [PATCH 08/16] fix typo in table name --- lnbits/extensions/events/crud.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lnbits/extensions/events/crud.py b/lnbits/extensions/events/crud.py index 9c6e5c6b1..9e04476d3 100644 --- a/lnbits/extensions/events/crud.py +++ b/lnbits/extensions/events/crud.py @@ -76,7 +76,7 @@ async def delete_ticket(payment_hash: str) -> None: async def delete_event_tickets(event_id: str) -> None: - await db.execute("DELETE FROM events.tickets WHERE event = ?", (event_id,)) + await db.execute("DELETE FROM events.ticket WHERE event = ?", (event_id,)) # EVENTS From e82ce89e9a1f61939182052bb71cf04a321f4d14 Mon Sep 17 00:00:00 2001 From: Tiago vasconcelos Date: Wed, 23 Feb 2022 13:32:23 +0000 Subject: [PATCH 09/16] change namedtuple to basemodel --- lnbits/extensions/tipjar/models.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lnbits/extensions/tipjar/models.py b/lnbits/extensions/tipjar/models.py index 0bfea50cd..92f25ab3a 100644 --- a/lnbits/extensions/tipjar/models.py +++ b/lnbits/extensions/tipjar/models.py @@ -1,5 +1,5 @@ from sqlite3 import Row -from typing import NamedTuple, Optional +from typing import Optional from fastapi.param_functions import Query from pydantic import BaseModel @@ -26,7 +26,7 @@ class createTip(BaseModel): message: str = "" -class Tip(NamedTuple): +class Tip(BaseModel): """A Tip represents a single donation""" id: str # This ID always corresponds to a satspay charge ID @@ -55,7 +55,7 @@ class createTips(BaseModel): message: str -class TipJar(NamedTuple): +class TipJar(BaseModel): """A TipJar represents a user's tip jar""" id: int From f7ff9d27d2255a5b7b14ff491e6ebf31150b2739 Mon Sep 17 00:00:00 2001 From: Tiago vasconcelos Date: Wed, 23 Feb 2022 21:03:25 +0000 Subject: [PATCH 10/16] fix copilots not being fetched --- lnbits/extensions/copilot/crud.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lnbits/extensions/copilot/crud.py b/lnbits/extensions/copilot/crud.py index e456334ea..d0da044eb 100644 --- a/lnbits/extensions/copilot/crud.py +++ b/lnbits/extensions/copilot/crud.py @@ -88,7 +88,7 @@ async def get_copilot(copilot_id: str) -> Copilots: async def get_copilots(user: str) -> List[Copilots]: rows = await db.fetchall( - "SELECT * FROM copilot.newer_copilots WHERE user = ?", (user,) + 'SELECT * FROM copilot.newer_copilots WHERE "user" = ?', (user,) ) return [Copilots(**row) for row in rows] From 42b444f54dfcb6926feaa232579568eae8729095 Mon Sep 17 00:00:00 2001 From: Tiago vasconcelos Date: Wed, 23 Feb 2022 21:40:11 +0000 Subject: [PATCH 11/16] make "anonymous" as default name --- lnbits/extensions/streamalerts/views_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lnbits/extensions/streamalerts/views_api.py b/lnbits/extensions/streamalerts/views_api.py index fa7ff7d26..0a678d8ba 100644 --- a/lnbits/extensions/streamalerts/views_api.py +++ b/lnbits/extensions/streamalerts/views_api.py @@ -114,7 +114,7 @@ async def api_create_donation(data: CreateDonation, request: Request): service_id = data.service service = await get_service(service_id) charge_details = await get_charge_details(service.id) - name = data.name + name = data.name if data.name else "Anonymous" description = f"{sats} sats donation from {name} to {service.twitchuser}" create_charge_data = CreateCharge( From 241c81c790424c76e843f9cca0b75e651ea7dbbc Mon Sep 17 00:00:00 2001 From: Tiago vasconcelos Date: Wed, 23 Feb 2022 22:09:38 +0000 Subject: [PATCH 12/16] fix update mempool --- lnbits/extensions/watchonly/views_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lnbits/extensions/watchonly/views_api.py b/lnbits/extensions/watchonly/views_api.py index 1122ef5cc..0cca67bc4 100644 --- a/lnbits/extensions/watchonly/views_api.py +++ b/lnbits/extensions/watchonly/views_api.py @@ -112,7 +112,7 @@ async def api_get_addresses(wallet_id, w: WalletTypeInfo = Depends(get_key_type) async def api_update_mempool( endpoint: str = Query(...), w: WalletTypeInfo = Depends(require_admin_key) ): - mempool = await update_mempool(endpoint, user=w.wallet.user) + mempool = await update_mempool(**{"endpoint": endpoint}, user=w.wallet.user) return mempool.dict() From 9b95a7743d722145c85cc680897d4c6d80aee168 Mon Sep 17 00:00:00 2001 From: Tiago vasconcelos Date: Mon, 28 Feb 2022 10:08:50 +0000 Subject: [PATCH 13/16] fix user keyword to "user" --- lnbits/extensions/jukebox/crud.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lnbits/extensions/jukebox/crud.py b/lnbits/extensions/jukebox/crud.py index 14dc4760e..caaac7e56 100644 --- a/lnbits/extensions/jukebox/crud.py +++ b/lnbits/extensions/jukebox/crud.py @@ -12,7 +12,7 @@ async def create_jukebox( juke_id = urlsafe_short_hash() result = await db.execute( """ - INSERT INTO jukebox.jukebox (id, user, title, wallet, sp_user, sp_secret, sp_access_token, sp_refresh_token, sp_device, sp_playlists, price, profit) + INSERT INTO jukebox.jukebox (id, "user", title, wallet, sp_user, sp_secret, sp_access_token, sp_refresh_token, sp_device, sp_playlists, price, profit) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """, ( @@ -41,6 +41,7 @@ async def update_jukebox( q = ", ".join([f"{field[0]} = ?" for field in data]) items = [f"{field[1]}" for field in data] items.append(juke_id) + q = q.replace("user", '"user"', 1) # hack to make user be "user"! await db.execute(f"UPDATE jukebox.jukebox SET {q} WHERE id = ?", (items)) row = await db.fetchone("SELECT * FROM jukebox.jukebox WHERE id = ?", (juke_id,)) return Jukebox(**row) if row else None @@ -57,11 +58,11 @@ async def get_jukebox_by_user(user: str) -> Optional[Jukebox]: async def get_jukeboxs(user: str) -> List[Jukebox]: - rows = await db.fetchall("SELECT * FROM jukebox.jukebox WHERE user = ?", (user,)) + rows = await db.fetchall('SELECT * FROM jukebox.jukebox WHERE "user" = ?', (user,)) for row in rows: if row.sp_playlists == None: await delete_jukebox(row.id) - rows = await db.fetchall("SELECT * FROM jukebox.jukebox WHERE user = ?", (user,)) + rows = await db.fetchall('SELECT * FROM jukebox.jukebox WHERE "user" = ?', (user,)) return [Jukebox(**row) for row in rows] From 6c0aa8fa8d9eb4690b7fc4722a3cc36a5334035a Mon Sep 17 00:00:00 2001 From: Tiago vasconcelos Date: Mon, 28 Feb 2022 10:09:40 +0000 Subject: [PATCH 14/16] info/error if no music is playing yet on jukebox --- lnbits/extensions/jukebox/views_api.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lnbits/extensions/jukebox/views_api.py b/lnbits/extensions/jukebox/views_api.py index 421ebf3aa..3ba8cbf25 100644 --- a/lnbits/extensions/jukebox/views_api.py +++ b/lnbits/extensions/jukebox/views_api.py @@ -75,7 +75,6 @@ async def api_check_credentials_check( juke_id: str = Query(None), wallet: WalletTypeInfo = Depends(require_admin_key) ): jukebox = await get_jukebox(juke_id) - return jukebox @@ -442,7 +441,7 @@ async def api_get_jukebox_currently( token = await api_get_token(juke_id) if token == False: raise HTTPException( - status_code=HTTPStatus.FORBIDDEN, detail="INvoice not paid" + status_code=HTTPStatus.FORBIDDEN, detail="Invoice not paid" ) elif retry: raise HTTPException( @@ -456,5 +455,5 @@ async def api_get_jukebox_currently( ) except: raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="Something went wrong" + status_code=HTTPStatus.NOT_FOUND, detail="Something went wrong, or no song is playing yet" ) From 8fb70041d2e2c96c5abc8b93f0d80a814047ff51 Mon Sep 17 00:00:00 2001 From: Tiago vasconcelos Date: Thu, 3 Mar 2022 21:35:58 +0000 Subject: [PATCH 15/16] fix flatrate per word toggle --- lnbits/extensions/lnticket/templates/lnticket/index.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lnbits/extensions/lnticket/templates/lnticket/index.html b/lnbits/extensions/lnticket/templates/lnticket/index.html index 1607925b5..915361614 100644 --- a/lnbits/extensions/lnticket/templates/lnticket/index.html +++ b/lnbits/extensions/lnticket/templates/lnticket/index.html @@ -421,12 +421,13 @@ }, updateformDialog: function (formId) { var link = _.findWhere(this.forms, {id: formId}) + console.log("LINK", link) this.formDialog.data.id = link.id this.formDialog.data.wallet = link.wallet this.formDialog.data.name = link.name this.formDialog.data.description = link.description - this.formDialog.data.flatrate = link.flatrate + this.formDialog.data.flatrate = Boolean(link.flatrate) this.formDialog.data.amount = link.amount this.formDialog.show = true }, From 2399b058553b58fc4e7dca80bb95b5989d0e3e8f Mon Sep 17 00:00:00 2001 From: Tiago vasconcelos Date: Thu, 3 Mar 2022 23:05:34 +0000 Subject: [PATCH 16/16] open ticket in dialog for large text --- .../lnticket/templates/lnticket/index.html | 52 ++++++++++++++++++- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/lnbits/extensions/lnticket/templates/lnticket/index.html b/lnbits/extensions/lnticket/templates/lnticket/index.html index 915361614..6572d98a8 100644 --- a/lnbits/extensions/lnticket/templates/lnticket/index.html +++ b/lnbits/extensions/lnticket/templates/lnticket/index.html @@ -117,9 +117,10 @@ {% raw %} @@ -136,9 +137,19 @@ :href="'mailto:' + props.row.email" > + + Click to show ticket + - {{ col.value }} + {{ col.label == "Ticket" ? col.value.length > 20 ? `${col.value.substring(0, 20)}...` : col.value : col.value }} @@ -249,6 +260,29 @@ + + + + {% raw %} + +

+ {{this.ticketDialog.data.name}} sent a ticket +

+
+ {{this.ticketDialog.data.email}} +
+ {{this.ticketDialog.data.date}} +
+ + +

{{this.ticketDialog.data.content}}

+
+ {% endraw %} + + + +
+
{% endblock %} {% block scripts %} {{ window_vars(user) }}