From f0a692f48e5875ff9b699d96f1a7d33a69a98c3d Mon Sep 17 00:00:00 2001 From: daywalker90 <8257956+daywalker90@users.noreply.github.com> Date: Thu, 1 Jan 2026 15:48:42 +0100 Subject: [PATCH] donations: actual integration test and several fixes/improvements - integration test doing a donation and checking if it shows up - production WSGI server waitress instead of dev server - CLN rpc fixes, decodepay -> decode, wait if listinvoies is not yet populated, msat field name fixed - qrcode dependency was missing pil to render qr codes - multithreading was no longer working for some reason, replaced with threading - fix typo in template copyrite -> copyright - formatted template code --- donations/donations.py | 63 ++- donations/pyproject.toml | 4 +- donations/templates/donation.html | 97 ++--- donations/test_donations.py | 66 +++- donations/uv.lock | 634 ++++++++++++++++++++++-------- 5 files changed, 640 insertions(+), 224 deletions(-) diff --git a/donations/donations.py b/donations/donations.py index d244f4112..65c876b17 100755 --- a/donations/donations.py +++ b/donations/donations.py @@ -3,13 +3,14 @@ # /// script # requires-python = ">=3.9.2" # dependencies = [ -# "qrcode>=7.4.2", +# "qrcode[pil]>=7.4.2", # "flask>=2.3.3", # "pyln-client>=24.11", # "flask-bootstrap>=3.3.7.1", # "flask-wtf>=1.2.1", # "werkzeug>=3.0.6", # "wtforms>=3.1.2", +# "waitress>=3.0.2", # ] # /// @@ -31,8 +32,10 @@ """ import base64 -import multiprocessing import qrcode +import threading +import logging +import sys from flask import Flask, render_template @@ -43,6 +46,7 @@ from random import random from wtforms import StringField, SubmitField, IntegerField from wtforms.validators import DataRequired, NumberRange +from waitress.server import create_server plugin = Plugin() @@ -79,7 +83,10 @@ def make_base64_qr_code(bolt11): def ajax(label): global plugin - msg = plugin.rpc.listinvoices(label)["invoices"][0] + invoices = plugin.rpc.listinvoices(label)["invoices"] + if len(invoices) == 0: + return "waiting" + msg = invoices[0] if msg["status"] == "paid": return "Your donation has been received and is well appricated." return "waiting" @@ -105,8 +112,8 @@ def donation_form(): if invoice["label"].startswith("ln-plugin-donations-"): # FIXME: change to paid after debugging if invoice["status"] == "paid": - bolt11 = plugin.rpc.decodepay(invoice["bolt11"]) - satoshis = int(bolt11["msatoshi"]) // 1000 + bolt11 = plugin.rpc.decode(invoice["bolt11"]) + satoshis = int(bolt11["amount_msat"]) // 1000 description = bolt11["description"] ts = bolt11["created_at"] donations.append((ts, satoshis, description)) @@ -126,14 +133,25 @@ def donation_form(): ) -def worker(port): +def worker(port, ready_event): app = Flask("donations") # FIXME: use hexlified hsm secret or something else app.config["SECRET_KEY"] = "you-will-never-guess-this" app.add_url_rule("/donation", "donation", donation_form, methods=["GET", "POST"]) app.add_url_rule("/is_invoice_paid/