diff --git a/lnbits/extensions/lnticket/__init__.py b/lnbits/extensions/lnticket/__init__.py index 0e0aa146a..cfdadc402 100644 --- a/lnbits/extensions/lnticket/__init__.py +++ b/lnbits/extensions/lnticket/__init__.py @@ -10,3 +10,8 @@ lnticket_ext: Blueprint = Blueprint( from .views_api import * # noqa from .views import * # noqa +from .tasks import register_listeners + +from lnbits.tasks import record_async + +lnticket_ext.record(record_async(register_listeners)) diff --git a/lnbits/extensions/lnticket/tasks.py b/lnbits/extensions/lnticket/tasks.py new file mode 100644 index 000000000..359c069c2 --- /dev/null +++ b/lnbits/extensions/lnticket/tasks.py @@ -0,0 +1,34 @@ +import json +import trio # type: ignore + +from lnbits.core.models import Payment +from lnbits.core.crud import create_payment +from lnbits.core import db as core_db +from lnbits.tasks import register_invoice_listener, internal_invoice_paid +from lnbits.helpers import urlsafe_short_hash + +from .crud import get_ticket, set_ticket_paid + + +async def register_listeners(): + invoice_paid_chan_send, invoice_paid_chan_recv = trio.open_memory_channel(2) + register_invoice_listener(invoice_paid_chan_send) + await wait_for_paid_invoices(invoice_paid_chan_recv) + + +async def wait_for_paid_invoices(invoice_paid_chan: trio.MemoryReceiveChannel): + async for payment in invoice_paid_chan: + await on_invoice_paid(payment) + +async def on_invoice_paid(payment: Payment) -> None: + if "lnticket" != payment.extra.get("tag"): + # not a lnticket invoice + return + + ticket = await get_ticket(payment.payment_hash) + if not ticket: + print("this should never happen", payment) + return + + await payment.set_pending(False) + await set_ticket_paid(payment_hash=payment.payment_hash) diff --git a/lnbits/extensions/lnticket/templates/lnticket/display.html b/lnbits/extensions/lnticket/templates/lnticket/display.html index 9a5accaf2..2aaa3cade 100644 --- a/lnbits/extensions/lnticket/templates/lnticket/display.html +++ b/lnbits/extensions/lnticket/templates/lnticket/display.html @@ -99,7 +99,11 @@ show: false, status: 'pending', paymentReq: null - } + }, + wallet: { + inkey: '' + }, + cancelListener: () => {} } }, computed: { @@ -128,12 +132,35 @@ }, closeReceiveDialog: function () { - var checker = this.receive.paymentChecker + var checker = this.startPaymentNotifier dismissMsg() - clearInterval(paymentChecker) setTimeout(function () {}, 10000) }, + startPaymentNotifier() { + this.cancelListener() + console.log(this.wallet) + this.cancelListener = LNbits.events.onInvoicePaid( + this.wallet, + payment => { + this.receive = { + show: false, + status: 'complete', + paymentReq: null + } + dismissMsg() + + this.formDialog.data.name = '' + this.formDialog.data.email = '' + this.formDialog.data.text = '' + this.$q.notify({ + type: 'positive', + message: 'Sent, thank you!', + icon: 'thumb_up' + }) + } + ) + }, Invoice: function () { var self = this axios @@ -158,39 +185,15 @@ status: 'pending', paymentReq: self.paymentReq } - - paymentChecker = setInterval(function () { - axios - .get('/lnticket/api/v1/tickets/' + self.paymentCheck) - .then(function (res) { - if (res.data.paid) { - clearInterval(paymentChecker) - self.receive = { - show: false, - status: 'complete', - paymentReq: null - } - dismissMsg() - - self.formDialog.data.name = '' - self.formDialog.data.email = '' - self.formDialog.data.text = '' - self.$q.notify({ - type: 'positive', - message: 'Sent, thank you!', - icon: 'thumb_up' - }) - } - }) - .catch(function (error) { - LNbits.utils.notifyApiError(error) - }) - }, 2000) }) .catch(function (error) { LNbits.utils.notifyApiError(error) }) } + }, + created() { + this.wallet.inkey = '{{form_wallet}}' + this.startPaymentNotifier() } }) diff --git a/lnbits/extensions/lnticket/templates/lnticket/index.html b/lnbits/extensions/lnticket/templates/lnticket/index.html index 7f2f8170a..bcd129459 100644 --- a/lnbits/extensions/lnticket/templates/lnticket/index.html +++ b/lnbits/extensions/lnticket/templates/lnticket/index.html @@ -230,7 +230,7 @@ {% endblock %} {% block scripts %} {{ window_vars(user) }}